使用时的NoMethodError:包含Rails 3中与Active Record的关联

时间:2011-09-14 18:10:45

标签: ruby-on-rails-3 activerecord

显然我在这里缺少一些简单的东西。这是我的两个类和我正在调用的代码。当我使用:include with find时,它会爆炸并在查找行上给我一个NoMethodError。当我不使用:include它工作得很好(但显然不做连接)

被叫代码

def index
    @users = User.find(:all, :include => [:org])
end

class User < ActiveRecord::Base
    belongs_to :org, :primary_key => :org_id
end

class Org < ActiveRecord::Base
    #define primary key because it is not :id
    #because this table is in an old db 
    #that can't be changed
    set_primary_key :org_id

    has_one :user

    def full_name
        "#{emp_fname} #{emp_lname}"
    end
end

确切错误

NoMethodError(当你没想到它时,你有一个零对象! 您可能期望一个Array实例。 评估nil.each时发生错误:

2 个答案:

答案 0 :(得分:0)

您使用的是什么版本的导轨?你的标签说3 - 是3.1还是3.0.x系列之一?无论如何,它似乎在3.0.x中:包含find isn't supported的哈希语法。

尝试User.includes(:org).find(:all)

答案 1 :(得分:0)

好的,经过大量的挖掘和反复试验后,基本上它是在一个模式中有一个表而在另一个模式中有另一个表的组合。通过为活动记录对象指定完全限定的表名,活动记录会自行停止。

所以最后的代码:

被叫代码

def index
    @users = User.includes(:org)
end

class User < ActiveRecord::Base
    set_table_name "DOC_REQUEST.USERS"

    belongs_to :org, :primary_key => :org_id
end

class Org < ActiveRecord::Base
    set_table_name "AOS.ORG"

    #define primary key because it is not :id
    #because this table is in an old db 
    #that can't be changed
    set_primary_key :org_id

    has_one :user

    def full_name
        "#{emp_fname} #{emp_lname}"
    end
end