【问题标题】:Querying based on two associated records基于两条关联记录查询
【发布时间】:2012-12-21 20:22:11
【问题描述】:

我的产品有很多变体,这些变体有两个属性:尺寸和颜色。
我想根据我传入的两个属性查询 Variant - 我让它可以使用以下内容:

variants = Spree::Variant.joins(:option_values).where(:spree_option_values => {:id => size.id}, :product_id => prod.id).joins(:option_values)

variant = variants.select{|v| v.option_values.include?(size)}

据我了解,select 方法或多或少会遍历数组,这有点慢。我宁愿有一个直接根据这两个属性查找变体的查询。
我尝试了以下方法:

Spree::Variant.joins(:option_values).where(:spree_option_values => {:id => size.id}, :product_id => prod.id).joins(:option_values).where(:spree_option_values => {:id => color.id})

但这最终只会返回一个空数组。
我该怎么办?

编辑:以下是产品、变体和 option_values 模型:

产品: https://github.com/spree/spree/blob/master/core/app/models/spree/product.rb

变体: https://github.com/spree/spree/blob/master/core/app/models/spree/variant.rb

选项值:https://github.com/spree/spree/blob/master/core/app/models/spree/option_value.rb 选项类型:https://github.com/spree/spree/blob/master/core/app/models/spree/option_type.rb

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    更新 2:你是对的,这不是你要找的。​​p>

    所以你可以:

    1) 构建 SQL 子查询:(如果连接表同时具有 sizecolor 则返回 TRUE)。它的工作速度有多快 - 是一个问题......

    2) 假设您已经为表“spree_option_values_variants”创建了一个模型“ValuesVariants”并踢出了 habtm(替换为 2 has_manys + 2 has_manys through)。现在您可以使用 (option_type_id = size_id||color_id AND variant_id IN (产品的变体 ID 数组)) 搜索 ValuesVariants,提取匹配的变体。它可以足够快......

    3) 你可以使用:includes。因此关联对象加载到内存中,第二次搜索通过数组方法进行。在这种情况下,问题在于内存使用情况。

    【讨论】:

    • 如果它们实际上是不同的属性,这将起作用,但事实并非如此。导致变体的产品具有多个选项值。因此,遗憾的是,它并不像查询尺寸和颜色本身那么简单。
    • 将 github 的链接添加到模型中,我希望能进一步解释它。 Size 和 Color 是 OptionTypes。
    • 所以尺寸和颜色不是属性,而是专用模型。?
    • 或多或少。 OptionType Color/Size 有_many OptionValues,它们是颜色或尺寸。抱歉,如果这有点令人困惑。
    • 那么,Color 和 Size 不是继承模型,只是 OptionType 的记录?尝试更新...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多