2

モデル (「パッケージ」) のインスタンスを、それが属する他の 2 つのモデル (「カット」と「アニマル」) との関係によって選択しようとしています。:cut_id 3 のパッケージと :animal_id 4 のパッケージが多数あるとしますが、両方を含むパッケージは 1 つだけである必要があります。その 1 つを選択して、その内容を表に表示したいと思います。

以下の 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 の Cut と Animal id 4 を持つ「the」パッケージが必要です。

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 に答える