1

靴、色、サイズの 3 つの基本モデルがあります。

靴には多くの色とサイズがありますが、色ごとに available_sizes があります。

これを実行できるようにするには、shoe_id と color_id の両方を見て、トリプル ジョイント モデルでそれらに従って size_ids をフェッチする必要があります。

反対の条件 (available_colors) も存在します。

次に、モデルは次のようになります。

class Shoe < ActiveRecord::Base
  has_many :stocks
  has_many :colors, through: :stocks
  has_many :sizes, through: :stocks
end

class Color < ActiveRecord::Base
  has_many :stocks
  has_many :shoes, through: :stocks
end

class Size < ActiveRecord::Base
  has_many :stocks
  has_many :shoes, through: :stocks
end

class Stock < ActiveRecord::Base
  belongs_to :shoe
  belongs_to :color
  belongs_to :size
end

私が欲しいのは、shoe.sizes.availabe_colorsorのようなものを照会することshoe.colors.available_sizesです。

すべての靴、色、およびサイズのモデルをうまく連携させるには、どのように関連付けを実装すればよいですか?

4

1 に答える 1

1

私があなたを正しく理解しているなら、あなたは特定の色を与えられた特定の靴のために利用可能なすべてのサイズを見つけたいと思っています。つまり、赤い靴「A」の在庫はどのくらいですか。

Stockは他のすべてのモデルを結合するものであるため、クエリを実行する必要があります。まず、特定の靴の在庫を取得することから始め、次に在庫を特定の色に切り詰めてから、固有のサイズを尋ねることができます。

Shoe.find(shoe_id).stocks.where(:color_id => color_id).sizes.uniq

これをクリーンアップするには、次のインスタンスメソッドにしますShoe

class Shoe < ActiveRecord::Base
  def available_sizes_for_color(color_id)
    stocks.where(:color_id => color_id).sizes.uniq
  end
end

Shoe.find(shoe_id).available_sizes_for_color(color_id)

サイズで色を見つける場合はその逆です。

ストックモデルを使用する代替手段:

class Stock < ActiveRecord::Base
  class << self
    def sizes(shoe_id, color_id)
      Shoe.find(shoe_id).stocks.where(:color_id => color_id).sizes.uniq
    end
  end
end

Stock.sizes(shoe_id, color_id)

そして最後に、サイズモデルを使用します。

class Size
  class << self
    def find_all_by_shoe_and_color(shoe_id, color_id)
      joins(:stock => [:shoe, :color]).where('shoes.id = ? AND colors.id = ?', size_id, color_id)
    end
  end
end

Size.find_all_by_shoe_and_color(shoe_id, color_id)
于 2013-02-16T19:25:29.057 に答える