名前付きスコープ構文で NOT IN を記述するにはどうすればよいですか? たとえば、User :has_many Photos の場合、次のように定義できます。
User.has_no_photo
Photo
モデルに含まれていないすべてのユーザーを返しますか? ありがとう!
名前付きスコープ構文で NOT IN を記述するにはどうすればよいですか? たとえば、User :has_many Photos の場合、次のように定義できます。
User.has_no_photo
Photo
モデルに含まれていないすべてのユーザーを返しますか? ありがとう!
named_scope :has_no_photos, :conditions => [
"id NOT IN ?",
Photo.all(:select => "distinct user_id").map(&:user_id).map(&:to_i)
]
標準の「Photo.belongs_to :user」関連付けと整数キーがあると仮定します
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
これを行うには、おそらくもっと効率的な方法があります。1 つは、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