我有一个非常简单的模型:
class User < ActiveRecord::Base
has_many :cookies
has_many :fortunes, :through => :cookies
end
class Cookie < ActiveRecord::Base
belongs_to :user
belongs_to :fortune
end
class Fortune < ActiveRecord::Base
has_many :cookies
has_many :users, :through => :cookies
end
对于给定用户u
,我可以
u.fortunes
这将通过Cookies表向我提供与此用户相关的所有财富。我想做的是让u.fortunes
没有归还所有财富。
我试过
Fortune.all(:limit => 5, :conditions => {:user => {:id._ne => u.id} })
但这不起作用:(。我是ActiveRecord的新手。
由于
答案 0 :(得分:1)
试试这个:
Fortune.limit(5).where("id not in (?)", u.fortunes.map(&:id))
(我在自己的桌子上尝试过)
答案 1 :(得分:0)
你可以做到
ids_to_reject = u.fortunes.map(&:id)
Fortune.all(:limit => 5, :conditions => ["id not in (?)", ids_to_reject])
答案 2 :(得分:0)
或试试这个
Fortune.includes(:cookies).limit(5).where([ 'cookies.user_id != ? OR cookies.user_id IS NULL', u.id ])
或者使用
语法Fortune.all(:include => :cookies, :limit => 5, :conditions => [ 'cookies.user_id != ? OR cookies.user_id IS NULL', u.id ])
不使用的原因包括:用户要避免一次额外的加入。
修改强> 其他建议更短,我认为找到(没有加入)时也会更快一些,我只是想展示如何使用关联。
答案 3 :(得分:0)
试试这个
@fortune=Fortune.find(:all).delete_if{|fortune| !fortune.user.nil? }
它将删除属于用户的命运,并将剩余的给我们。