Может ли rails scopes фильтровать по количеству связанных классов для данного поля - PullRequest
2 голосов
/ 29 июня 2011

Я использую Rails 3 с Mongoid.

У меня есть класс Folder, который можно использовать совместно с другими классами пользователя как таковым

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...

Вместо этого я рассмотрел методы построения, но предпочел бы прицелы, поскольку хочу связать их с другими прицелами.

Ответы [ 2 ]

7 голосов
/ 29 июня 2011

Поскольку вы обращаетесь к ссылочным документам, ваш метод users является виртуальным атрибутом, к которому вы не можете получить доступ во время запроса. Однако вы можете использовать user_ids (массив идентификаторов User в вашем документе Folder) для выполнения требуемых запросов:

Любой из них должен работать для вашей личной сферы:

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

И для вашей общей области:

scope :shared, where(:user_ids.ne => [])
4 голосов
/ 29 июня 2011
scope :personal, where({ "$or" => [{:user_ids => nil}, {:user_ids => {"$size"=>0}}] })
scope :shared, where({ "$nor" => [{:user_ids => nil}, {:user_ids => {"$size"=>0}}] })

Это должно обрабатывать оба случая, когда: user_ids не установлен или равен нулю, и когда он установлен в пустой массив.

...