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?

Author: Anurag, 2010-01-22

3 answers

  1. 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.

  2. 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!

 49
Author: Staelen,
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.

 8
Author: ryan0,
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 ale class Group has_many :members, :through => memberships. Model pośredni membership jest przydatny do śledzenia odwrotnej relacji.

  • Rozszerzalność : zależność has_one :through można łatwo rozszerzyć i rozszerzony do has_many :through

 7
Author: 0x4a6f4672,
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