has_and_belongs_to_many, где обе модели имеют имена с подчеркиванием

Я работаю с Rails 3.2.1 и имею две модели CookingVenue и DiningVenue со связанными таблицами MySQL для cook_venues иdining_venues. Я настроил отношение «имеет и принадлежит ко многим» между двумя моделями, но как здесь называется имя таблицы MySQL, представляющее объединение?

Is it cooking_venues_dining_venues?

Будет ли Rails пытаться найти связь между приготовлением пищи и местами проведения мероприятий и т. д., или Rails действительно достаточно умен, чтобы со всем этим разобраться?


person nexar    schedule 01.03.2012    source источник


Ответы (2)


Как вы сказали, cook_venues_dining_venues — это имя таблицы соединений. После создания этой таблицы с полями cook_venue_id иdining_venue_id вам необходимо определить связь has_and_belongs_to_many в обеих моделях.

class CookingVenue < ActiveRecord::Base
  has_and_belongs_to_many :dining_venues       # foreign keys in the join table
end
class DiningVenue < ActiveRecord::Base
  has_and_belongs_to_many :cooking_venues    # foreign keys in the join table
end
person xaph    schedule 01.03.2012
comment
Большое спасибо за ваши оперативные ответы. Зайдя так далеко, я теперь борюсь с тем, как добавлять записи в таблицу соединений. Скажем, у меня есть Cooking_venue [id: 3, desc: 'Кухня A'] и Dining_venue [id: 5, desc: Nice Eatery'. Кажется, у меня есть умственный блок, как сопоставить эти 2 в таблице соединений. Много материала о том, как создать таблицу соединения, но не так много о том, как создать саму запись. Наверно так просто, что и объяснять не надо..... кроме меня. - person nexar; 03.03.2012
comment
Чтобы ответить на мой собственный второй вопрос, это то, что я придумал. В CookingVenue_Controller я могу сделать: c=CookingVenue.find(3) d=DiningVenue.find(5) c.dining_venues ‹‹ d. Это создает правильную запись в таблице. Теперь мой вопрос меняется на: правильный ли это способ «Rails» или есть что-то более элегантное? - person nexar; 03.03.2012
comment
да, оператор ‹‹ правильный путь. Однако, если вы хотите создать объект при добавлении, вы можете использовать c.dining_venues.create({:attribute_name =› 'значение атрибута' }) - person xaph; 04.03.2012
comment
Моя единственная забота о том, как я это сделал, заключается в том, что в базе данных есть 2 попадания, чтобы сначала найти 2 объекта, а затем вставить 3-ю запись, просто состоящую из идентификаторов 2 объектов, которые у меня были с самого начала . Я думаю, что может быть более эффективным просто использовать оператор вставки sql непосредственно в таблице соединений. Не «Рельсы», но, безусловно, более эффективны. - person nexar; 05.03.2012

Ага. Вы просто называете таблицу соединения в альфа-порядке, как вы сделали, и все должно быть хорошо.

person DVG    schedule 01.03.2012