Undefined метод для ActiveRecord:: Relation
Модель пользователя
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
Ответы
Ответ 1
Ну, вы возвращаете объект ActiveRecord::Relation
, а не экземпляр модели, поэтому ошибка, так как в ActiveRecord::Relation
нет метода под названием lastname
.
Выполнение @medicalhistory.first.lastname
работает, потому что @medicalhistory.first
возвращает первый экземпляр модели, найденный с помощью where
.
Кроме того, вы можете распечатать @medicalhistory.class
как для рабочего, так и для кода ошибки и посмотреть, как они отличаются.
Ответ 2
Еще одно замечание: :medicalhistory
должно быть множественным, поскольку это отношение has_many
Итак, ваш код:
class User < ActiveRecord::Base
has_many :medicalhistory
end
Должно быть написано:
class User < ActiveRecord::Base
has_many :medicalhistories
end
Из документов Rails (найдено здесь)
Название другой модели плюрализуется при объявлении has_many ассоциации.
Это связано с тем, что рельсы автоматически определяют имя класса из имени ассоциации.
Если только пользователь had_one
medicalhistory
был бы единственным, как вы писали:
class User < ActiveRecord::Base
has_one :medicalhistory
end
Я знаю, что вы уже приняли ответ, но подумал, что это поможет уменьшить дальнейшие ошибки/путаницу.