与三个模型创建循环关联

时间:2013-02-16 14:24:53

标签: ruby-on-rails rails-activerecord

我有3种基本款,如鞋子,颜色和尺码。

鞋子有很多种颜色和很多尺码,但每种颜色都有可用的鞋子。

为了能够执行,我应该看看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_colorsshoe.colors.available_sizes的内容。

我应该如何实施关联以使所有鞋子,颜色和尺码模型很好地协同作用?

1 个答案:

答案 0 :(得分:1)

如果我理解你的话,你想要找到特定颜色的特定鞋子的所有可用尺码。换句话说,红鞋的尺寸有多少,A&#34; A&#34;

由于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)

反之亦然,按尺寸查找颜色。

使用Stock模型的替代方案:

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)

最后,使用Size模型:

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)