2011-05-14 22 views
22

modelo de usuariométodo no definido de ActiveRecord :: Relation

class User < ActiveRecord::Base 
    has_many :medicalhistory 
end 

modelo Mdedicalhistory

class Medicalhistory < ActiveRecord::Base 
    belongs_to :user #foreign key -> user_id 
    accepts_nested_attributes_for :user 
end 

error

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 
+0

¿cuál es el mensaje de error? –

+0

¿Funciona '@ medicalhistory.first.lastname'? – Zabba

+0

:(sí que lo hace .... insight? – Omnipresent

Respuesta

39

Bueno, que está recibiendo de vuelta un objeto de ActiveRecord::Relation, no su instancia modelo, por lo tanto, el error ya que no hay m ethod llamado lastname en ActiveRecord::Relation.

Haciendo @medicalhistory.first.lastname funciona porque @medicalhistory.first está devolviendo la primera instancia del modelo que fue encontrado por where.

Además, puede imprimir @medicalhistory.class para el código de trabajo y "error" y ver cómo son diferentes.

+1

Gracias , Me perdí el primer método cuando miraba la API. – Smar

5

otra cosa a tener en cuenta, :medicalhistory debe ser plural, ya que es un has_many relación

Así que su código:

class User < ActiveRecord::Base 
    has_many :medicalhistory 
end 

debe ser escrito:

class User < ActiveRecord::Base 
    has_many :medicalhistories 
end 

A partir de los documentos de Rieles (found here)

El nombre del otro modelo está pluralizado al declarar una asociación has_many .

Esto se debe a que los rieles automáticamente infieren el nombre de la clase del nombre de la asociación.

Si un usuario sólo had_onemedicalhistory esto sería tan singular que había escrito:

class User < ActiveRecord::Base 
    has_one :medicalhistory 
end 

Sé que ya aceptó una respuesta, pero pensó que esto ayudaría a reducir aún más los errores/confusión.

Cuestiones relacionadas