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)

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

使用 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)
于 2013-02-16T19:25:29.057 回答