2010-06-08 44 views
0

如何在命名範圍語法中編寫NOT IN?例如,用戶:照片的has_many,我怎麼能定義:命名作用域NOT IN,如何?

User.has_no_photo 

,並返回誰在Photo模型是不是所有的用戶?謝謝!

回答

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:用戶「關聯和整數鍵

+1

這會給Fixnum一個錯誤 - NoMethodError:undefined方法'user_id'。你可能是想在'user_id'之後映射'to_i'(或者省去第二個映射......) – 2010-06-08 19:07:25

+0

是的,謝謝,修正了 – 2010-06-08 19:15:31

+0

''id not in??''應該是''id not in(?) 「' – ohho 2010-06-13 03:49:39

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 
+0

不好的例子。計數器緩存不能保證全部時間一致 – 2010-06-08 18:57:10

+0

對於大多數目的,它們通常足夠一致。這是你作爲開發者的工作,以確保他們保持一致。 – 2010-06-09 17:32:20