如何在命名範圍語法中編寫NOT IN?例如,用戶:照片的has_many,我怎麼能定義:命名作用域NOT IN,如何?
User.has_no_photo
,並返回誰在Photo
模型是不是所有的用戶?謝謝!
如何在命名範圍語法中編寫NOT IN?例如,用戶:照片的has_many,我怎麼能定義:命名作用域NOT IN,如何?
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:用戶「關聯和整數鍵
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-08 18:57:10
對於大多數目的,它們通常足夠一致。這是你作爲開發者的工作,以確保他們保持一致。 – 2010-06-09 17:32:20
這會給Fixnum一個錯誤 - NoMethodError:undefined方法'user_id'。你可能是想在'user_id'之後映射'to_i'(或者省去第二個映射......) – 2010-06-08 19:07:25
是的,謝謝,修正了 – 2010-06-08 19:15:31
''id not in??''應該是''id not in(?) 「' – ohho 2010-06-13 03:49:39