1

Rails 3.2.8を使用して単純なスコープを作成しています。ここでは、データベースのカテゴリ列でフィルタリングします。次に例を示します。

scope :category_1, where(:category => 'category_1')
scope :category_2, where(:category => 'category_2')

次に、両方のスコープを使用してデータベースからオブジェクトを取得しようとすると、次のようになります。

Model.category_1.category_2.all

次のような where 句を生成する代わりにアクティブ レコード:

WHERE category = 'category_1' AND category = 'category_2'

次のような where 句を生成します。

WHERE category = 'category_2'

両方の条件を AND 処理して応答として空白の配列を返すことを期待しますが、代わりにすべての category_2 オブジェクトを取得します。

スコープを使用する代わりに、次のようなクラス メソッドを使用する場合:

def self.category_1
  self.where(:category => 'category_1')
end

期待どおりの結果が得られます。

ここで質問があります。これは期待される Rails の動作ですか? 私の条件は、属性のスコープで最後に呼び出されたものに置き換える必要がありますか、または WHERE 条件を追加する残りのスコープのように AND 句に追加する必要がありますか?

4

1 に答える 1

0

ActiveRecord は、条件が重複する可能性がないことを認識しているため (一連のハッシュ キーと同様)、スマートになろうとしています。これを回避するには、スコープをラムダでラップしてみてください。

scope :category_1, lambda { where(:category => 'category_1') }
scope :category_2, lambda { where(:category => 'category_2') }
于 2012-09-20T21:21:13.370 に答える