Rails ma jeden:poprzez Stowarzyszenie
Rails ma asocjację has_one :through
, która pomaga skonfigurować asocjację jeden do jednego z trzecim modelem, przechodząc przez drugi model. Jaki jest prawdziwy pożytek z tego, oprócz tworzenia skojarzenia na skróty, które w przeciwnym razie byłoby dodatkowym krokiem.
Biorąc ten przykład z przewodnika :
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łoby osiągnięte jako:
supplier.account.history
Jeśli chodzi tylko o prostszy dostęp to technicznie można bądź asocjacją jeden do jednego, która łączy model z pewnym modelem N-tym przechodzącym przez modele n-1 dla Łatwiejszego Dostępu. Czy jest w tym coś jeszcze, co mi umyka poza skrótem?
3 answers
Logika , OK może to zabrzmieć trochę słabo, ale logiczne byłoby stwierdzenie, że "mam dostawcę, który ma konto u mnie, Chcę zobaczyć całą historię konta tego dostawcy", więc sensowne jest dla mnie, aby mieć dostęp do historii konta bezpośrednio od dostawcy.
-
Efficiency , to jest dla mnie główny powód, dla którego użyłbym
:through
, po prostu dlatego, że to wystawia oświadczenie join zamiast wywoływania dostawcy, a następnie konto, a następnie account_history. zauważyłeś liczbę połączeń z bazami danych?-
Aby uzyskać dostęp do account_history (rails automatycznie używa
:join
do pobierania poprzez konto) -
Używanie zwykłego skojarzenia, 1 wywołanie do get supplier, 1 wywołanie do get account I 1 wywołanie do get account_history
-
Tak myślę =) mam nadzieję, że to pomoże!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-27 22:06:02
Dziwię się, że nikt nie dotknął obiektów asocjacyjnych .
A has_many
(LUB has_one
) :through
związek ułatwia korzystanie z Asocjacja obiektu wzorzec czyli wtedy, gdy dwie rzeczy są ze sobą powiązane, a sama relacja ma atrybuty (tj. datę utworzenia związku lub jego wygaśnięcia).
Jest to uważane przez niektórych za dobrą alternatywę dla has_and_belongs_to_many
ActiveRecord helper. Rozumowanie za tym jest to, że jest bardzo prawdopodobne, że będziesz musiał zmienić charakter stowarzyszenia lub dodać do niego, a gdy jesteś kilka miesięcy w projekcie, może to być bardzo bolesne, jeśli związek został początkowo skonfigurowany jako has_and_belongs_to_many
(drugi link wchodzi w szczegóły). Jeśli jest on początkowo skonfigurowany przy użyciu relacji has_many :through
, to po kilku miesiącach od projektu można łatwo zmienić nazwę modelu łączenia lub dodać do niego atrybuty, co ułatwia deweloperom reagowanie na zmieniające się wymagania. Plan dla zmiana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 13:45:14
Odwrotne Stowarzyszenie : rozważmy klasyczną sytuację user-membership-group. Jeśli użytkownik może być członkiem wielu grup, to grupa ma wielu członków lub użytkowników, a użytkownik ma wiele grup. Ale jeśli użytkownik może być członkiem tylko jednej grupy, grupa nadal ma wielu członków:
class User has_one :group, :through => :membership
aleclass Group has_many :members, :through => memberships
. Model pośrednimembership
jest przydatny do śledzenia odwrotnej relacji.-
Rozszerzalność : zależność
has_one :through
można łatwo rozszerzyć i rozszerzony dohas_many :through
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-02 14:23:31