ActiveRecord :: Relation的未定义方法

时间:2011-05-14 21:26:49

标签: ruby-on-rails-3 activerecord

用户模型

class User < ActiveRecord::Base
  has_many :medicalhistory 
end

Mdedicalhistory模型

class Medicalhistory < ActiveRecord::Base
  belongs_to :user #foreign key -> user_id
  accepts_nested_attributes_for :user
end

错误

undefined method `lastname' for #<ActiveRecord::Relation:0xb6ad89d0>


#this works
@medicalhistory = Medicalhistory.find(current_user.id) 
print   "\n" + @medicalhistory.lastname

#this doesn't!
@medicalhistory = Medicalhistory.where("user_id = ?", current_user.id)
print   "\n" + @medicalhistory.lastname #error on this line

2 个答案:

答案 0 :(得分:39)

好吧,你回来的是ActiveRecord::Relation的对象,而不是你的模型实例,因此错误,因为lastname中没有名为ActiveRecord::Relation的方法。

执行@medicalhistory.first.lastname是有效的,因为@medicalhistory.first正在返回where找到的模型的第一个实例。

此外,您可以打印@medicalhistory.class工作和“错误”代码,看看它们是如何不同的。

答案 1 :(得分:5)

另外需要注意的一点是,:medicalhistory应为复数,因为它是has_many关系

所以你的代码:

class User < ActiveRecord::Base
  has_many :medicalhistory 
end

应该写:

class User < ActiveRecord::Base
  has_many :medicalhistories 
end

来自Rails文档(found here

  

在声明has_many时,其他模型的名称会复数   关联。

这是因为rails会自动从关联名称中推断出类名。

如果用户只有had_one medicalhistory,那么这就像你写的那样是单数:

class User < ActiveRecord::Base
  has_one :medicalhistory 
end

我知道你已经接受了答案,但认为这有助于减少进一步的错误/混淆。