我的产品有很多变体,这些变体有两个属性:尺寸和颜色 我想根据我传入的两个属性查询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
答案 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。所以关联的对象加载到内存中,第二次搜索通过数组方法完成。在这种情况下,关注的是内存使用情况。