3

そのように定義された2つの単純な名前付きスコープがあります:

class Numbers < ActiveRecord::Base
  named_scope :even, :conditions => {:title => ['2','4','6']}
  named_scope :odd, :conditions => {:title => ['1','3','5']}
end

Numbers.even を呼び出すと、正しい 2,4,6 が返されます Numbers.odd を呼び出すと、正しい 1,3,5 が返されます

Numbers.even.odd のようにチェーンすると、1,3,5 が返されます。これが参照する最後のスコープだからです。Numbers.odd.even と言うと、実際には 2,4,6 になります。

それらをチェーンすると、1、2、3、4、5、6になると予想されます。私が試したもう1つのアプローチは次のとおりです。

named_scope :even, :conditions => ["title IN (?)", ['2', '4','6']]
named_scope :odd, :conditions => ["title IN (?)", ['1', '3','5']]

しかし、作成するクエリは次のようになるため、それらを連鎖させても結果は得られません。

SELECT * FROM `numbers` 
WHERE ((title IN ('1','3','5')) AND (title IN ('2','4',6')))

「AND」句を OR に変更する必要がありますが、それを強制する方法がわかりません。これは ActiveRecord の問題でしょうか??

4

1 に答える 1

5

これは、ActiveRecord がスコープを処理する方法の問題です。複数のスコープを適用すると、結果は AND で結合されます。OR を使用するオプションはありません。

代わりに行う必要があるのは、2 つの結果セットを結合することです。

Numbers.even.all + Numbers.odd.all
于 2010-06-10T18:04:54.130 に答える