以下是具有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>'
此致
答案 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