0

如何在命名范围语法中编写 NOT IN?例如,用户:has_many 照片,我该如何定义:

User.has_no_photo

并返回所有不在Photo模型中的用户?谢谢!

4

2 回答 2

0

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
于 2010-06-08T18:52:48.287 回答
0
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”关联和整数键

于 2010-06-08T19:03:46.863 回答