2012-12-21 173 views
0

我有一個產品有許多變體,這些變體有兩個屬性:大小和顏色。
我想查詢基於兩個屬性,我通過在變 - 我得到了它與下面的工作:基於兩個關聯記錄查詢

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)} 

從我的理解,選擇方法通過數組,這或多或少迭代有點慢。我寧願有一個查詢直接基於這兩個屬性查找變體。
我試過如下:

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

回答

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)您可以使用:includes。所以關聯的對象加載到內存中,第二次搜索通過數組方法來完成。在這種情況下,關心的是內存使用情況。

+0

這將工作,如果他們實際上會是不同的屬性,但他們不是。產品has_many option_values,導致變體。因此,可悲的是,只是查詢尺寸和顏色本身而已。 –

+0

你能顯示模型代碼嗎?產品,變體等... –

+0

添加到模型的Github的鏈接,我希望能解釋它更多一點。大小和顏色是選項類型。 –