Подтвердить что ты не робот

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 для облегчения доступа. Есть ли что-нибудь еще, что я пропал без ярлыка?

4b9b3361

Ответ 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