【问题标题】:Ruby on Rails error in active relation, NoMethodError: undefined method 'methodname' for #<ActiveRecord::Relation:0x00000002ab5908>活动关系中的 Ruby on Rails 错误,NoMethodError: undefined method 'methodname' for #<ActiveRecord::Relation:0x00000002ab5908>
【发布时间】:2013-11-01 05:51:35
【问题描述】:

这是两个具有 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>'

问候

【问题讨论】:

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


    【解决方案1】:

    首先,您声明了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 返回第一个满足指定条件的对象本身(默认情况下,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
    

    【讨论】:

    • 尝试使用find 方法,而不是where
    【解决方案2】:

    您是否与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关联的e_user

    编辑 您可以像这样检查 where

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

    【讨论】:

    • 检查您在 EUser 类中的关联,然后像这样更改 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多