#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. спасибо за помощь