Ruby on Rails在活动关系中出错,NoMethodError:未定义的方法'methodname'用于#<activerecord :: relation:0x00000002ab5908> </activerecord :: relation:0x00000002ab5908>

时间:2013-10-23 05:28:34

标签: ruby-on-rails rails-activerecord model-associations active-relation

以下是具有1对1关联的两个模型的代码

class User < ActiveRecord::Base
  has_one :e_user
  validates_presence_of :first_name
  validates_presence_of :last_name
  validates :password, presence: true, :length => { :minimum => 6}
  validates_uniqueness_of :email, :message => ": This email is already registered!"
  validates_presence_of :email  
end

以下是第二个模型:

class EUser < ActiveRecord::Base
  belongs_to : user
end

当我进入rails console并从db获取用户时,通过执行

a = User.where(:id => 1)

我在一个用户中找到了一个用户。现在我想让e_user与a相关联(如果它应该返回它或返回null),但是当我在控制台中键入a.EUser时出现错误消息,错误是

NoMethodError: undefined method `EUser' for  #<ActiveRecord::Relation:0x00000002ab5908>from /home/faraz/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.1.1/lib/active_record/relation.rb:459:in `method_missing'
from (irb):3
from /home/faraz/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start'
from /home/faraz/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start'
from /home/faraz/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.1.1/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

此致

2 个答案:

答案 0 :(得分:8)

首先,您已声明User has_one :e_user。因此,正确的关系查找是:

first_user = User.first
first_user.e_user

其次,where ActiveRecord方法返回ActiveRecord::Relation对象类型。你需要的是User对象本身。相反,请使用find

a = User.find(1)
a.e_user

解释where方法返回一个ActiveRecord::Relation对象,其中包含满足条件结构条件的所有类对象。但是,即使where只返回一条记录,该记录仍将包含在该类数组结构中;在访问 ActiveRecord::Relation中的对象之前,将无法访问检索到的类上的任何实例方法。

另一方面,

find返回满足指定条件的第一个对象本身(默认情况下,ActiveRecord与对象id匹配)。因此,find方法返回的任何对象都具有完整的实用程序,并且可以使用为这些类对象定义的实例方法和属性:

find_user = User.find(1)
where_user = User.where(:id => 1)

find_user.class
#=> User
where_user.class
#=> ActiveRecord::Relation

find_user == where_user
#=> false

find_user == where_user.first
#=> true

答案 1 :(得分:0)

您是否使用a.e_user

进行了检查
class User < ActiveRecord::Base

   has_one :e_user

end

class EUser < ActiveRecord::Base

 belongs_to :user

end

a= User.find(1)

a.e_user#应检索与

关联的用户

修改 你可以查看这样的地方

a = User.where(:id => 1)
euser = a.first.e_user