Rails 3.1 Активная запись — загрузка родительского объекта в has_many: через связь

#ruby-on-rails #ruby-on-rails-3 #activerecord

#ruby-on-rails #ruby-on-rails-3 #activerecord

Вопрос:

У меня есть следующая структура классов для приложения, которое я переношу с php на rails:

 class Menu < ActiveRecord::Base
  has_many :menu_headers
  has_many :menu_items, :through => :menu_headers
end

class MenuHeader < ActiveRecord::Base
  acts_as_tree :parent_id
  has_many :menu_items
  belongs_to :menu
end

class MenuItem < ActiveRecord::Base
  belongs_to :menu_headers
end
  

Как бы мне загрузить MenuHeader или Menu для определенного элемента меню?

Нравится:

 ruby-1.9.2-p290 :004 > @b=Menu.find(1)  #works
ruby-1.9.2-p290 :005 > @b.menu_headers  #works
ruby-1.9.2-p290 :006 > @b.menu_items    #works

ruby-1.9.2-p290 :004 > @mi=MenuItem.find(1) #works
ruby-1.9.2-p290 :005 > @mi.menu_headers     #doesn't work
ruby-1.9.2-p290 :006 > @mi.menus            #doesn't work
  

спасибо

Ответ №1:

Вам нужны особые ассоциации следующим образом:

 class MenuItem < ActiveRecord::Base
  belongs_to :menu_header
  has_one :menu, :through => :menu_header
end
  

Комментарии:

1. нужно ли мне добавлять menu_item_id в таблицу меню, поскольку связь уже существует в другом направлении? @mi.menu ни @mi.menus один из них, похоже, этого не делает. спасибо

2. Нет, through опция означает, что она будет искать menu_header ассоциацию для menu . Можете ли вы дважды проверить, совпадают ли ваши идентификаторы в БД, я думаю, это должно сработать.

3. хм …. похоже, не работает. Нужен ли MenuHeader has_one или belongs_to достаточно? спасибо — определенно отсутствие понимания с моей стороны

4. Подождите, вы правы (см. Последнее сообщение) — я не убрал ‘s’ из отношения menu_headers в MenuItem. спасибо за помощь