#ruby-on-rails-3 #activerecord
#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
Комментарии:
1.
@medicalhistory.first.lastname
Работает ли?2. не уверен, что это «лучшая практика», но @medicalhistory = Medicalhistory.where(«user_id = ?», current_user.id )[0] должен работать
3. как новичок, использование
find
вместоwhere
исправило проблемы для меня
Ответ №1:
Что ж, вы получаете обратно объект ActiveRecord::Relation
, а не экземпляр вашей модели, отсюда и ошибка, поскольку в lastname
ActiveRecord::Relation
не вызывается метод.
Это @medicalhistory.first.lastname
работает, потому что @medicalhistory.first
возвращает первый экземпляр модели, который был найден where
.
Кроме того, вы можете распечатать @medicalhistory.class
как рабочий, так и «ошибочный» код и посмотреть, чем они отличаются.
Комментарии:
1. Спасибо, я пропустил
first
метод при просмотре API.
Ответ №2:
Следует отметить еще одну вещь, :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
Я знаю, что вы уже приняли ответ, но подумали, что это поможет уменьшить дальнейшие ошибки / путаницу.