ActiveRecord找不到(has_many)

时间:2012-11-26 01:33:39

标签: ruby-on-rails ruby activerecord

我有一个非常简单的模型:

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 个答案:

答案 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? }

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