Próbuję się rozejrzeć inverse_of
i nie rozumiem.
Jak wygląda wygenerowany plik sql, jeśli w ogóle?
Czy inverse_of
opcja wykazują takie samo zachowanie, jeśli stosować :has_many
, :belongs_to
i :has_many_and_belongs_to
?
Przepraszam, jeśli to takie podstawowe pytanie.
Widziałem ten przykład:
class Player < ActiveRecord::Base
has_many :cards, :inverse_of => :player
end
class Card < ActiveRecord::Base
belongs_to :player, :inverse_of => :cards
end
ruby-on-rails
activerecord
Federico
źródło
źródło
Myślę, że
:inverse_of
jest to najbardziej przydatne, gdy pracujesz ze skojarzeniami, które nie zostały jeszcze utrwalone. Na przykład:Teraz w konsoli:
Bez
:inverse_of
argumentówt.project
zwrócinil
, ponieważ wyzwala zapytanie sql, a dane nie są jeszcze zapisane. Wraz z:inverse_of
argumentami dane są pobierane z pamięci.źródło
:inverse_of
rozwiązałem problem podczas tworzenia nowych obiektów nadrzędnych i podrzędnych w tej samej formie.Po tym pr ( https://github.com/rails/rails/pull/9522 ) inverse_of nie jest wymagane w większości przypadków.
Moduł Active Record obsługuje automatyczną identyfikację większości skojarzeń ze standardowymi nazwami. Jednak moduł Active Record nie zidentyfikuje automatycznie powiązań dwukierunkowych, które zawierają zakres lub którąkolwiek z następujących opcji:
W powyższym przykładzie odwołanie do tego samego obiektu jest przechowywane w zmiennej
a
oraz w atrybuciewriter
.źródło
inverse_of
czy nie, wynik dlaa.first_name == b.author.first_name
jest zawsze właściwy.Tylko aktualizacja dla wszystkich - właśnie używaliśmy
inverse_of
jednej z naszych aplikacji zhas_many :through
powiązaniemZasadniczo udostępnia obiekt „pochodzenie” obiektowi „potomnemu”
Więc jeśli używasz przykładu Railsów:
Użycie
:inverse_of
umożliwia dostęp do obiektu danych, którego jest odwrotnością, bez wykonywania dalszych zapytań SQLźródło
Kiedy mamy 2 modele z relacjami has_many i contrib_to, zawsze lepiej jest użyć inverse_of, które informują ActiveRecod, że należą do tej samej strony asocjacji. Więc jeśli zostanie wyzwolone zapytanie z jednej strony, będzie buforować i wyświetlać z pamięci podręcznej, jeśli zostanie wyzwolone z przeciwnego kierunku. Co poprawia wydajność. Od Rails 4.1, inverse_of zostanie ustawione automatycznie, jeśli użyjemy obcego_klucza lub zmian w nazwie klasy musimy ustawić jawnie.
Najlepszy artykuł ze szczegółami i przykładami.
http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations
źródło
Spójrz na ten artykuł !!
http://gsusmonzon.blogspot.com.br/2011/09/rails-power-of-inverseof.html
źródło
Jeśli masz
has_many_through
relację między dwoma modelami, użytkownikiem i rolą, i chcesz zweryfikować przypisanie modelu łączącego pod kątem nieistniejących lub nieprawidłowych wpisów za pomocąvalidates_presence of :user_id, :role_id
, jest to przydatne. Nadal można wygenerować użytkownika @user z jego skojarzeniem@user.role(params[:role_id])
, aby zapisanie użytkownika nie spowodowało niepowodzenia walidacji modelu przypisania.źródło
Proszę spojrzeć na 2 dwa przydatne zasoby
I pamiętaj o ograniczeniach
inverse_of
:źródło