Rails has_and_belongs_to_many сбивает меня с толку приспособлениями и фабриками
-
13-09-2019 - |
Вопрос
Общее замешательство
У меня есть группы, которые могут иметь 3 жанра.Я прочитал в предыдущий пост SO что правильный способ справиться с этим - это пара шагов:
1) В банд.рб
has_and_belongs_to_many :genres
2) Создайте таблицу соединения Band_genres.
Даже прочитав документацию, я немного не понимаю, что на самом деле означает HABTM.Наверное, я бы обычно думал, что «у группы много жанров», а не что она принадлежит многим жанрам.Так что было бы здорово дать быстрое ТУПОЕ объяснение.
Путаница со светильниками
Кроме того, при выполнении моего приспособления для Band_genres у меня есть
{
"The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
"The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }
}
И я получаю столбец «неизвестная» группа.Я думал, что рельсы должны были знать, что «The Reaper Band» будет относиться к группе из приспособления группы (разумеется, с тем же именем), и захватывать этот идентификатор и знать, что «группа» в этом приспособлении будет ссылаться на Band_id в таблице соединений. .Я бы предпочел, чтобы мои светильники выглядели так, а не имели жестко закодированные номера.
Путаница с фабриками
Когда я создаю группу на своем заводе, я хочу присвоить ей жанры:
Factory.define :band do |f|
f.sequence(:name) { |n| "Band#{n}" }
f.mailing_lists { |mailing_lists| [mailing_lists.association(:mailing_list)] }
f.genres 2
end
Я понимаю, что здесь мне, вероятно, понадобится жестко закодированный жанр_id.Но почему бы Rails не посмотреть на это и не сказать: «О, он хочет добавить жанр с id=2 в таблицуband_genres».
Я не ожидаю, что Rails возьмет на себя всю грязную работу за меня, но я хочу играть по правилам.
Решение
- Имеет и принадлежит многим, определяет отношения в обоих направлениях.Если вам нужно только посмотреть, к каким жанрам принадлежит группа, подойдет has_many.Если вы хотите узнать, какие группы относятся к «фанку», вы можете использовать HABTM для поиска групп определенного жанра.
- Что касается креплений, в рельсах теперь можно выполнять HABTM, не создавая отдельное приспособление для соединительной таблицы.Например:
в Bands.yml:
reaper_band:
name: The Reaper Band
genres: funk, rock
в жанрах.yml:
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band