неопределенный метод для ActiveRecord :: Relation - PullRequest
22 голосов
/ 15 мая 2011

Модель пользователя

class User < ActiveRecord::Base
  has_many :medicalhistory 
end

Модель исторической истории

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 ]

39 голосов
/ 15 мая 2011

Ну, вы получаете объект ActiveRecord::Relation, а не экземпляр вашей модели, поэтому ошибка, так как в ActiveRecord::Relation нет метода с именем lastname.

Выполнение @medicalhistory.first.lastname работает, потому что@medicalhistory.first возвращает первый экземпляр модели, который был найден where.

Кроме того, вы можете распечатать @medicalhistory.class как для рабочего, так и для "ошибочного" кода и посмотреть, чем они отличаются.

5 голосов
/ 07 ноября 2013

Еще одна вещь, которую нужно отметить, :medicalhistory должно быть во множественном числе, поскольку это has_many отношение

Итак, ваш код:

class User < ActiveRecord::Base
  has_many :medicalhistory 
end

Должно быть написано:

class User < ActiveRecord::Base
  has_many :medicalhistories 
end

Из документации Rails ( найдено здесь )

Имя другой модели множится при объявлении ассоциации has_many.

Это потому, что rails автоматически выводит имя класса из имени ассоциации.

Если пользователь только had_one medicalhistory, это будет единственное число, как вы написали:

class User < ActiveRecord::Base
  has_one :medicalhistory 
end

Я знаю, что вы уже приняли ответ, но подумали, что это поможет уменьшить дальнейшие ошибки/confusion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...