我试图通过它与其所属的另外两个模型(“Cut”和“Animal”)的关系来挑选模型的实例(“Package”)。虽然有很多软件包有:cut_id 3和许多包含:animal_id 4,但两者都应该只有一个,我想选择那个并在表格中显示其内容。
我尝试了下面的DIY混乱,并没有真正起作用。 (cutfind是我创建的一种方法,我知道它可以用来调出与给定动物相关的所有切割。)
<% @animal.cutfind.each do |cut| %>
<tr>
<td><%= cut.name %></td>
<td><%= number_to_currency(cut.price) %></td>
<td><%= cut.package_weight %> lb</td>
<% @a = Package.where(:animal_id => @animal.id) %>
<% @pset = @a.where(:cut_id => cut.id) %>
<% @pset.each do |p| %>
<td><%= p.original %></td>
<td><%= p.left %></td>
<% end %>
</tr>
<%end%>
知道怎么做[更好]?感谢。
更新:我尝试了其他DIY混乱并且遇到了同样的问题(甚至没有创建单元格,这让我相信@pset是空的。)
这是我的动物模型:
def packagefind
Package.where(:animal_id => self.id)
end
然后我改变了上面的内容:
<td><%= cut.package_weight %> lb</td>
<% @pset = @animal.packagefind.where(:cut_id => cut.id) %>
<% @pset.each do |p| %>
<td><%= p.original %></td>
<td><%= p.left %></td>
<% end %>
答案 0 :(得分:3)
如果您定义以下关系,Rails将自动生成帮助您查找关联记录的方法:
class Animal
has_many :cuts
has_many :packages, :through => :cuts
end
class Cut
belongs_to :animal
belongs_to :package
end
class Package
has_many :cuts
has_many :animals, :through => :cuts
end
在您的控制器中,以下行将eager load您视图中需要的所有记录:
@animal = Animal.includes(:cuts => :package)
您的观点可以缩短为:
<% @animal.cuts.each do |cut| %>
<tr>
<td><%= cut.name %></td>
<td><%= number_to_currency(cut.price) %></td>
<td><%= cut.package_weight %> lb</td>
<td><%= cut.package.original %></td>
<td><%= cut.package.left %></td>
</tr>
<%end%>
答案 1 :(得分:2)
由于我无法对您的帖子发表评论,我猜测: 你有以下的架构:
剪切 - &gt;包&lt; - Animal
在此,&#34; - &gt;&#34;和&#34;&lt; - &#34;是一对多的关系,所以
class Package < ActiveRecord::Base
has_many :cuts
has_many :animals
end
所以,你想要&#34;&#34;&#34;包,已切割为ID 3和动物ID 4。 你试过了吗?
x = Product.select { |product| product.cuts.include?(Cut.find(3)) }.select{ |product| product.animals.include?(Animal.find(4)) }
编辑:我首先建议您使用
Product.find_by_product_id_and_animal_id()
哪个不起作用,但向OP展示了这样做的方式