2012-09-17 32 views
0

我试图从一个框中检索所有项目的数据,一个框可以有隔间并且我想要在框级别获得所有隔间信息。项目是多形的,因为盒子不一定有隔间。Rails:从嵌套模型中检索多态数据

模型

class Box < ActiveRecord::Base 
    has_many :compartments 
    has_many :items, :as => :itemable 
end 

在我的控制,我可以得到结果回来:

@box = Box.find(params[:id]) 

@itemable = @box.compartments.first 

@itemable = @box.compartments.last 

VIEW

<% @items.each do |item| %> 
<%= item.name %> 
<% end %> 

但如果我再尝试

@itemable = @box.compartments 

OR

@itemable = @box.compartments.find(:all) 

我得到的错误

undefined method `items' for #<ActiveRecord::Array> 

OR

undefined method `items' for #<ActiveRecord::Relation> 

任何人都可以从所有舱室获得返回结果帮助吗?

+0

可能你需要使用'.itemables',按':as =>:itemable'? – pdoherty926

+0

您是否在可编程和隔间类中定义了“belongs_to”? – megas

+0

@megas项目是多态的,所以在Compartments中我有:has_many:items,:as =>:itemable太 – ritchielee

回答

0

所以在车厢你有

belongs_to :box 
has_many :items, :as => :itemable 

是这种情况? @box.compartments应该返回一个隔间数组的权利?这听起来像items不知何故被调用@box.compartments

+0

是的,隔间belongs_to框。我注意到@ box.compartments的错误更改为# ritchielee

+0

未定义的方法'项目'后[@ box.compartments]我可以做[@items = @ itemable.first.items],所以数组似乎工作 - 我只需要弄清楚如何在控制器中循环这个,我想呢? – ritchielee

+0

我以为'@itemable = @ box.compartments'抛出一个错误,所以你不能尝试'@ itemable.first.items' – Ramfjord