0

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

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

4

1 回答 1

0

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

这样你就可以:

1)构建SQL子查询:(如果连接的表同时有大小颜色,则返回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)您可以使用:包括。因此关联对象加载到内存中,第二次搜索通过数组方法进行。在这种情况下,关注的是内存使用情况。

于 2012-12-21T20:35:42.907 回答