Rails has_one: через объединение
Rails имеет ассоциацию has_one :through
, которая помогает настроить взаимно-однозначную связь с третьей моделью, пройдя вторую модель. Каково реальное использование этого, помимо создания сочетания ярлыков, что в противном случае было бы дополнительным шагом.
Взяв этот пример из Rails 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
может позволить нам сделать что-то вроде:
supplier.account_history
который в противном случае был бы достигнут как:
supplier.account.history
Если это только для более простого доступа, тогда технически может существовать ассоциация "один к одному", которая соединяет модель с некоторой n-й моделью, проходящей через модели n-1 для облегчения доступа. Есть ли что-нибудь еще, что я пропал без ярлыка?
Ответы
Ответ 1
-
Логика, это может показаться немного слабым для этого, но было бы логично сказать, что "у меня есть поставщик, у которого есть учетная запись со мной, я хочу видеть весь историю учетной записи этого поставщика", поэтому имеет смысл для меня иметь возможность напрямую обращаться к истории аккаунта от поставщика.
-
Эффективность, это для меня главная причина, по которой я буду использовать :through
, просто потому, что это вызывает оператор соединения, а не вызов поставщика, а затем учетную запись, а затем account_history. заметили количество вызовов базы данных?
-
используя :through
, 1 вызов, чтобы получить поставщика, 1 вызов для получения account_history (рельсы автоматически используют :join
для извлечения с учетной записи)
-
с использованием обычной ассоциации, 1 вызов для получения поставщика, 1 вызов для получения учетной записи и 1 вызов для получения account_history
Это то, что я думаю =) надеюсь, что это поможет!
Ответ 2
Я удивлен, что никто не коснулся Объектов ассоциации.
Отношение has_many
(или has_one
) :through
облегчает использование шаблона объекта ассоциации, когда у вас есть две вещи, связанные друг с другом, а само это отношение имеет атрибуты (то есть дату когда была создана ассоциация или когда она истекает).
Некоторые считают это хорошей альтернативой помощнику has_and_belongs_to_many
ActiveRecord. Причиной этого является то, что очень вероятно, что вам нужно будет изменить природу ассоциации или добавить ее, и когда вы занимаетесь проектом пару месяцев, это может быть очень болезненным, если отношения изначально были установлены как has_and_belongs_to_many
(вторая ссылка уходит в некоторые детали). Если он изначально настроен с использованием отношения has_many :through
, то через пару месяцев в проекте легко переименовать модель соединения или добавить к ней атрибуты, чтобы разработчикам было проще реагировать на изменяющиеся требования. План изменений.
Ответ 3
-
Обратная связь: рассмотрим классическую ситуацию user-membership-group. Если пользователь может быть членом во многих группах, то группа имеет много членов или пользователей, и у пользователя есть много групп. Но если пользователь может быть только членом в одной группе, группа все еще имеет много членов: class User has_one :group, :through => :membership
, но class Group has_many :members, :through => memberships
. Промежуточная модель membership
полезна для отслеживания обратной зависимости.
-
Расширяемость: отношение has_one :through
можно легко расширить и расширить до отношения has_many :through