Rails has_and_belongs_to_many сбивает меня с толку и фабрики - PullRequest
6 голосов
/ 12 июня 2009

Общая путаница
У меня есть группы, которые могут иметь 3 жанра. Я прочитал в предыдущем посте SO , что правильный способ справиться с этим - пара шагов:

1) In band.rb

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" }  
}

И я получаю «неизвестную» колонку группы. Я думал, что rails должен был знать, что «The Reaper Band» будет ссылаться на группу из фиксатора группы (с тем же именем), и будет захватывать этот идентификатор и знать, что «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

Я понимаю, что здесь мне, вероятно, понадобится жестко закодированный genre_id. Но почему рельсы не смотрят на это и не говорят «о, он хочет добавить жанр с id = 2 в таблицу band_genres».

Я не ожидаю, что рельсы позаботятся обо всей грязной работе для меня, но я хочу играть по правилам.

1 Ответ

21 голосов
/ 12 июня 2009
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...