1

这是具有 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 控制台并从 db 获取用户时,通过

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

我得到了一个用户。现在我想获取与 a 关联的 e_user(如果有的话,它应该返回它或返回 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>'

问候

4

2 回答 2

8

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

first_user = User.first
first_user.e_user

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

a = User.find(1)
a.e_user

解释:该where方法返回一个ActiveRecord::Relation对象,该对象包含所有满足类数组结构条件的类对象。但是,即使where只返回一条记录,该记录仍将包含在该类数组结构中;ActiveRecord::Relation您访问.

find另一方面,返回满足指定条件的第一个对象本身id(默认情况下,ActiveRecord 与对象匹配)。因此,该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
于 2013-10-23T05:33:31.063 回答
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#should 检索与 a 关联的 e_user

编辑 您可以像这样检查 where

a = User.where(:id => 1)
euser = a.first.e_user
于 2013-10-23T05:33:14.620 回答