根据两个相关记录查询

时间:2012-12-21 20:22:11

标签: ruby-on-rails activerecord

我的产品有很多变体,这些变体有两个属性:尺寸和颜色 我想根据我传入的两个属性查询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})

但这只会导致返回一个空数组 我该怎么做呢?

编辑:以下是product,variant和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

OptionValue:https://github.com/spree/spree/blob/master/core/app/models/spree/option_value.rb OptionType:https://github.com/spree/spree/blob/master/core/app/models/spree/option_type.rb

1 个答案:

答案 0 :(得分:0)

更新2:你是对的,这不是你想要的。

所以你可以:

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

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

3)您可以使用:includes。所以关联的对象加载到内存中,第二次搜索通过数组方法完成。在这种情况下,关注的是内存使用情况。