Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zad5 #125

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
Open

Zad5 #125

wants to merge 17 commits into from

Conversation

s14990
Copy link

@s14990 s14990 commented Apr 15, 2019

Wyliczanie wartosci siege ability jest prowadzone po kazdym create, update, destroy warriorów ktore nalezą do tego building => to nie powino obciązac baze

@s14990
Copy link
Author

s14990 commented Apr 16, 2019

Znalazlem sposób jak zachowywac spojnosc siege ability po zmianie pola warriora na inny building

@s14990
Copy link
Author

s14990 commented Apr 17, 2019

Chyba rspec nie wywoluje te callbacks na before_update i after_update

@@ -1,7 +1,21 @@
# frozen_string_literal: true

class BuildingsController < ApplicationController
def index; end
def index
render json: Building.all.order(:id), include: [:warriors]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Id nie jest domyslnym orderem? :D

end
def self.call(building:)
# this should stop the method if getting null
return unless building
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To sprawdzenie spokojnie by się mogło znaleźć gdzieś wyżej, żeby nie obciążać logiki serwisu :) Serwis najlepiej jeśli ma jedną odpowiedzialność, a Twój serwis poza liczeniem ile dni przetrwa dany budynek, stwierdza upadłość budynku jeśli nie ma w nim wojowników :)

if building.warriors.any?
warriors_count = building.warriors.where(type: 'Warriors::Samurai').count
hussar_count = building.warriors.where(type: 'Warriors::Hussar').count
total_rice_need = warriors_count + hussar_count * 2 + building.default_rice_need
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Te powyższe trzy linijki ładniej by wyglądałī, jeśli Warrior miałby zaimplementowaną metodę/atrybut np. supply_burn_rate, który zwraca 1 jeśli warrior nie ma konia i 2 jeśli go ma, wtedy nie trzeba by myśleć nad takimi ifami w tym serwisie :)

# if warrior is changing his buildings
if building_id_was != building_id
# save this attribute wihtout triggering callbacks
update_column(:prev_building_id, building_id_was)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Z tego co pamiętam update_column omija walidację więc nie jest to najlepszy sposób na edycje kolumny :D Najprosciej byłoby dodać relację typu belongs_to z opcją optional: true :) Optional pozwoli na ustawianie nila na tej kolumnie, nie trzeba nic zmieniać w bazie, bo bazy domyślnie pozwalają na nile, a jedynie rails sam waliduje to że nie mogą być nilem :)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Poza tym w sumie gdy sie wbijasz callbackiem miedzy zmiane danych a sve, masz dostep do zmiennej metody changes, ktora zwraca to co sie zmienilo, dzieki czemu nie ma potrzeby w tym przypadku poprzednim budynek na uzytkowniku, bo w callbacku informacja z jakiego na jakiego zmienilo sie building id juz jest


expect(building.siege_ability).to eq(250)
end
# Fail got 500 instead of 0
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To może wynikać z tego, że dla building trzeba przeładować atrybuty i asocjacje z bazy za pomocą metody '.reload'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants