通过两个关系识别模型实例

时间:2012-09-24 21:05:58

标签: ruby-on-rails ruby-on-rails-3 activerecord associations models

我试图通过它与其所属的另外两个模型(“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 %>

2 个答案:

答案 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展示了这样做的方式