0

多くのバリエーションを持つ製品があります。これらのバリエーションには、サイズと色の 2 つの属性があります。
渡す2つの属性に基づいてバリアントを照会したい-次のように動作するようになりました:

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 メソッドは多かれ少なかれ配列を反復処理しますが、これは少し遅いです。これら 2 つの属性に基づいてバリアントを直接検索するクエリが必要です。
私は次のことを試しました:

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

4

1 に答える 1

0

更新 2: そうです、これはあなたが探しているものではありません。

だからあなたはできる:

1) SQL サブクエリを作成します: (結合されたテーブルにサイズが同時にある場合は、TRUE を返します)。それがどのくらい速く機能するか-問題です...

2) テーブル "spree_option_values_variants" のモデル "ValuesVariants" を作成し、habtm を追い出したとします (2 つの has_manys + 2 has_manys に置き換えます)。これで、ValuesVariants を (option_type_id = size_id||color_id AND variant_id IN (製品のバリエーション ID の配列)) で検索して、一致するバリエーションを抽出できます。それは十分に速いかもしれません...

3) :includes を使用できます。そのため、関連するオブジェクトがメモリにロードされ、2 回目の検索は配列メソッドによって行われます。この場合、問題はメモリ使用量です。

于 2012-12-21T20:35:42.907 に答える