2011-06-29 2 views
2

私はMongoidでRails 3を使用しています。railsスコープは、指定されたフィールドの関連するクラスの数をフィルタできます。

私はすべてのプライベートフォルダを返すために使用できる2つのスコープを作成しようとしている、もう1つは、すべて返すためにそのような

class Folder 
    has_one :owner 
    has_many :users 

として他のユーザーのクラスと共有することができるフォルダのクラスを持っています共有フォルダ。スコープ内の関連付けの数を数える方法はありますか?

scope :personal, where(:users.count => 0) #Erroring on count... 
    scope :shared, where(:users.count.gt => 0) #Erroring on count... 

私は建築方法を考えていましたが、他のスコープでチェーンしたいのでスコープを好むでしょう。

答えて

7

参照先のドキュメントにアクセスしているため、usersメソッドは仮想属性であり、クエリ中にアクセスすることはできません。ただし、必要なクエリの種類を実行するためにuser_ids(あなたFolder文書のUser IDの配列)を使用することができます。

これらのどちらかは、あなたの個人的な範囲のために働く必要があります。

scope :personal, where(:user_ids.size => 0) 
# or 
scope :personal, where(:user_ids => []) 

そして、あなたの共有のためにスコープ:

scope :shared, where(:user_ids.ne => []) 
これは両方のケースを処理する必要があり
+0

私にとってはうまくいかないでしょうか?私に光をあげてください:http://stackoverflow.com/q/26911752/717506 – josal

4
scope :personal, where({ "$or" => [{:user_ids => nil}, {:user_ids => {"$size"=>0}}] }) 
scope :shared, where({ "$nor" => [{:user_ids => nil}, {:user_ids => {"$size"=>0}}] }) 

:user_ids設定またはnullでされていないし、それを空の配列に設定されます。

+0

ここでは、 '$ or'と' $ nor'クエリは冗長です。デフォルトでは、Mongoidはすべての新しいアソシエーションに対して空の配列を作成するので、 'user_ids'は' nil'になることはありません。 – theTRON

+0

私のローカルシステムには、has_manyの学生がいる大学があります。それにはnil user_idsフィールドが含まれています。 – rubish

+0

@theTRONちょうどupvoteが戻ってきたので、dbにすでにいくつかの文書がある場合、関連付けが後の段階で追加された場合に起こります。 – rubish

関連する問題