代码之家  ›  专栏  ›  技术社区  ›  user2603796

Ruby on Rails在活动关系中出错,NoMethodError:#<ActiveRecord::relation:0x00000002ab5908>的未定义方法“methodname”

  •  1
  • user2603796  · 技术社区  · 11 年前

    这是两个模型的代码,它们有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控制台并从数据库中获取一个User时

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

    我在a中得到了一个用户。现在我想得到与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>'
    

    当做

    2 回复  |  直到 11 年前
        1
  •  9
  •   zeantsoi    11 年前

    首先,你已经宣布 User has_one :e_user 因此,正确的关系查找是:

    first_user = User.first
    first_user.e_user
    

    第二 where ActiveRecord方法返回 ActiveRecord::Relation 对象类型。你需要的是 使用者 对象本身。相反,使用 find :

    a = User.find(1)
    a.e_user
    

    解释 : 哪里 方法返回 ActiveRecord::关系 包含的对象 全部的 类对象,这些对象满足类数组结构中的条件。然而,即使 哪里 只返回一条记录,该记录仍将包含在类似数组的结构中;在访问对象之前,检索到的类上的任何实例方法都无法访问 在内部 这个 ActiveRecord::关系 .

    发现 ,另一方面,返回第一个对象 它本身 满足指定条件(默认情况下,ActiveRecord与对象匹配 id ). 因此 发现 方法对为这些类对象定义的实例方法和属性具有完全的实用性和用途:

    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
    
        2
  •  0
  •   Debadatt    11 年前

    你和核实过了吗 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_用户 #应该检索使用

    编辑 你可以像这样在哪里查询

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