0

我有一个非常简单的模型,如下所示:

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 的新手。

谢谢

4

4 回答 4

1

试试这个:

Fortune.limit(5).where("id not in (?)", u.fortunes.map(&:id))

(我在自己的桌子上试过)

于 2012-11-26T01:54:39.423 回答
0

你可以做

ids_to_reject = u.fortunes.map(&:id)
Fortune.all(:limit => 5, :conditions => ["id not in (?)", ids_to_reject])
于 2012-11-26T01:38:32.827 回答
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 ])

不使用 include :users 的原因是为了避免额外的加入。

编辑: 其他建议更短,我认为在查找(无连接)时也更快一些,我只想展示如何使用关联。

于 2012-11-26T01:54:32.717 回答
0

试试这个

    @fortune=Fortune.find(:all).delete_if{|fortune| !fortune.user.nil? }

它将删除属于用户的财富,并将剩余的给我们。

于 2012-11-26T13:00:14.320 回答