неопределенный метод для ActiveRecord::Relationship

#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
  

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