Rails has_and_belongs_to_many сбивает меня с толку приспособлениями и фабриками

StackOverflow https://stackoverflow.com/questions/984566

Вопрос

Общее замешательство
У меня есть группы, которые могут иметь 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 возьмет на себя всю грязную работу за меня, но я хочу играть по правилам.

Это было полезно?

Решение

  1. Имеет и принадлежит многим, определяет отношения в обоих направлениях.Если вам нужно только посмотреть, к каким жанрам принадлежит группа, подойдет has_many.Если вы хотите узнать, какие группы относятся к «фанку», вы можете использовать HABTM для поиска групп определенного жанра.
  2. Что касается креплений, в рельсах теперь можно выполнять 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top