【问题标题】:Creating circular association with three models使用三个模型创建循环关联
【发布时间】:2013-02-17 18:32:25
【问题描述】:

我有 3 种基本型号,分别是鞋子、颜色和尺码。

鞋子有多种颜色和多种尺寸,但对于每种颜色,它们都有 available_sizes。

为了能够做到这一点,我应该同时查看 shoe_id 和 color_id 并根据它们在三联模型上获取 size_id。

相反的条件(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 之类的内容。

我应该如何实现关联以使所有鞋子、颜色和尺码模型都能很好地协同工作?

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案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-01-12
    • 2016-07-30
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多