именованная область НЕ В, как? - PullRequest
0 голосов
/ 08 июня 2010

как я могу написать NOT IN в именованном объеме синтаксиса?Например, Пользователь: has_many Фотографии, как я могу определить:

User.has_no_photo

и вернуть всех пользователей, которые не входят в модель Photo?спасибо!

Ответы [ 2 ]

0 голосов
/ 08 июня 2010
named_scope :has_no_photos, :conditions => [ 
  "id NOT IN ?", 
  Photo.all(:select => "distinct user_id").map(&:user_id).map(&:to_i)
]

Я предполагаю, что у вас есть стандартная ассоциация "Photo.belongs_to: пользователь" и целочисленные ключи

0 голосов
/ 08 июня 2010

ActiveRecord не отличается от того, что вы делаете в SQL:

class User < ActiveRecord::Base
  has_many :photos
  named_scope :has_no_photos,
    :conditions => "(SELECT COUNT(#{Photo.table_name}.*)
                     FROM #{Photo.table_name}
                     WHERE #{Photo.table_name}.user_id = #{User.table_name}.id) = 0"
end

Возможно, есть более эффективные способы сделать это. Можно было бы сохранить photos_count в пользовательских строках: тогда запрос становится простым photos_count = 0 вместо сложного объединения:

class Photo < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
end

class User < ActiveRecord::Base
  has_many :photos
  named_scope :has_no_photos, :conditions => {:photos_count => 0}
end
...