Объясните различие между has_and_belongs_to_many и has_many через отношения. Когда и где использовать который?
Насколько я помню, has_and_belongs_to_many
дает вам простую таблицу поиска, которая ссылается на две ваши модели.
Например,
Истории могут принадлежать многим категориям. Категории могут иметь много историй.
Categories_Stories Table
story_id | category_id
has_many :through
дает вам третью модель, которая может быть использована для хранения различных других частей информации, которые не принадлежат ни одной из исходных моделей.
Например
Человек может подписаться на множество журналов. Журналы могут иметь много подписчиков.
Таким образом, мы можем иметь модель подписки в середине, которая дает нам таблицу, похожую на предыдущий пример, но с дополнительными свойствами.
Subscriptions Table
person_id | magazine_id | subscription_type | subscription_length | subscription_date
И так далее.
Простейшее практическое правило заключается в том, что вы должны настроить связь has_many: through, если вам нужно работать с моделью отношений как с независимым объектом. Если вам не нужно ничего делать с моделью отношений, может быть проще установить связь has_and_belongs_to_many (хотя вам нужно не забыть создать объединяющуюся таблицу в базе данных). Вы должны использовать has_many: через, если вам нужны проверки, обратные вызовы или дополнительные атрибуты в модели соединения.