Szyny mają powiązanie has_one :through
, które pomaga skonfigurować powiązanie jeden do jednego z trzecim modelem, przechodząc przez drugi model. Jakie jest rzeczywiste użycie tego, poza tworzeniem powiązania skrótów, które w przeciwnym razie byłoby o krok dalej.Szyny has_one: przez asocjację
Biorąc ten przykład z szyn guide:
class Supplier < ActiveRecord::Base
has_one :account
has_one :account_history, :through => :account
end
class Account < ActiveRecord::Base
belongs_to :supplier
has_one :account_history
end
class AccountHistory < ActiveRecord::Base
belongs_to :account
end
może pozwoli nam zrobić coś takiego:
supplier.account_history
które w przeciwnym razie zostałyby osiągnięte jak:
supplier.account.history
Jeśli jest to tylko dla łatwiejszego dostępu, to technicznie może istnieć powiązanie jeden do jednego t łączy model z jakimś n-tym modelem przechodzącym przez modele n-1 dla łatwiejszego dostępu. Czy jest coś jeszcze, czego mi brakuje oprócz skrótu?
Myślę, że argument logiczny jest całkiem poprawny. Brzmi bardziej naturalnie, powiedzmy, zdobądź historię konta tego dostawcy, a nie historię konta dostawcy. Bardzo subtelny, ale wciąż łatwiejszy do zapamiętania, biorąc pod uwagę filozofię płynących Ruby/Railsów niż kod. Wiem, że możemy zobaczyć faktyczne kwerendy DB są wydawane, ale czy Railsy określają, w jaki sposób te wywołania metody przełożyłoby się na SQL? – Anurag
Pozwala to również uniknąć naruszenia prawa Demeter. –
@TomCrayford, naprawdę nie wiem jak to działa. Czy to nie sprawia, że relacja jest mniej bezpośrednia? –