0

関連する 2 つの属性に基づいてレコードを検索しようとしています。関連にこれら 2 つのレコードが含まれている場合は、レコードを選択する必要があります。

これまでのところ、次のことを試しました-これは非常に悪い習慣に思えたので、使用を避けたいです。

@size = Spree::OptionValue.find(params[:size])
@color = Spree::OptionValue.find(params[:color])

vari = Spree::Variant.all
vari.each do |va|
  if va.option_values.include?(@size && @color)
    @variant = va
  end
end

これまでのところ、私も試しました

@variant = Spree::Variant.all(:include => :option_values, :conditions => ['option_value.id = ?', params[:color])

これは進むべき道のようですが、結果を得るための正しい方法を理解できないようです。私が取得し続ける戻りエラーは次のとおりです。

ActiveRecord::StatementInvalid: PG::Error: エラー: テーブル "option_values" の FROM 句エントリがありません 行 1: ..._option_values_variants"."option_value_id" WHERE (option_val...

編集:

受け入れられた回答で与えられた大きな助けのおかげで、私はそれを機能させました:

Spree::Variant.joins(:option_values).where("spree_option_values.id in (?)", [size, color])
4

1 に答える 1

1

まず、コードが壊れている可能性があります。それがあなたが思っていることを.include?(@size && @color)しているとは思えません。option_valuesincludesかどうかのみを効果的にチェックしています@color。これは を行うのと同じ(true && @color)です。両方の値を含めたい場合は、 が必要.include?(@size) && .include?(@color)です。

したがって、コードはおそらく次のようになります。

vari = Spree::Variant.all
vari.each do |va|
  if va.option_values.include?(@size) && va.option_values.include?(@color)
    @variant = va
  end
end

次に、コードをより Ruby 風にすることができます。

@variant = Spree::Variant.all.select do |v|
  v.option_values.include?(@size) && v.option_values.include?(@color)
end

ただし、テーブル全体をアプリケーションにロードするよりも、データベース レベルで実際に条件を評価する方がはるかに優れています。OptionValue関連する に、選択した@sizeとの 2 つが含まれるすべてのレコードを探しているようです@color

探しているクエリは、おそらく次のようになります。

Spree::Variant.joins(:option_values).where("option_values.id in (?)", [@size, @color])
于 2012-11-06T20:22:10.237 に答える