我有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_colors
或shoe.colors.available_sizes
的内容。
我应该如何实施关联以使所有鞋子,颜色和尺码模型很好地协同作用?
答案 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)