2

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

2 回答 2

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

在您的控制器中,以下行将急切加载您在视图中需要的所有记录:

@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%>
于 2012-09-24T21:59:14.657 回答
2

由于我无法对您的帖子发表评论,因此我猜测:您具有以下架构:

剪切 -> 包装 <- 动物

其中,“->”和“<-”是一对多的关系,所以

class Package < ActiveRecord::Base
  has_many :cuts
  has_many :animals
end

所以,你想要“那个”包,它有 id 3 和 Animal id 4 的 Cut。你试过了吗:

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

于 2012-09-24T21:15:54.200 回答