Подтвердить что ты не робот

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
4b9b3361

Ответ 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

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