2012-05-19 11 views
5

Cuando estoy en los rieles 3.2 de la consola, que pueden hacer esto muy bien:rieles ActiveRecord encontramos en la consola

p = Person.last 
p.last_name 

y se imprime el apellido.

Pero cuando trato de encontrarlo por el id, es capaz de localizar el registro único y almacenarlo en la variable de mi p, pero no puedo imprimir la columna de la last_name . Por ejemplo:

p = Person.where(id: 34).limit(1) 

impresión p aquí muestra todas las columnas, pero p.last_name dice este

NoMethodError: undefined method `last_name' for 
#<ActiveRecord::Relation:0x000000055f8840> 

cualquier ayuda se agradece.

Respuesta

9

Una consulta where devolverá un ActiveRecord::Relation, que actúa como una matriz, incluso si limita el número de registros devueltos.

Si en lugar de cambiar la consulta a:

p = Person.where(id: 34).first 

que funcionará como desee, y Arel sabe para limitar automáticamente la consulta a un solo resultado, por lo que no tiene que especificar explícitamente limit(1).

También puede cambiar a cualquiera de

p = Person.find(34) # Throws an ActiveRecord::RecordNotFound exception if Person with id 34 does not exist 

o

p = Person.find_by_id(34) # Returns nil if Person with id 34 does not exist. Does *not* throw an exception. 

y ha de devolver un solo registro como se esperaba.

EDITAR: A donde la consulta devuelve una relación ActiveRecord ::, como @mu is too short mencionado en los comentarios.

+0

Sí, cierto, pero no quería confundir la situación aún más. – x1a4

+0

p = Person.find_by_id (34) para la victoria. Gracias. –

1

Lo que es probable que esté buscando realmente es

@person = Person.find(34) 
@person.last_name 
3

Esto devuelve una colección de objetos de registro activos:

p = Person.where(id: 34).limit(1) 

Pero sólo hay una con id = 34, por lo que es una colección de 1 .

La manera de hacer esto es:

p = Person.where(id: 34).limit(1).first 

, o mejor:

p = Person.where(id: 34).first 

o, aún mejor:

p = Person.find(34) 
0

En su Persona caso es una clase y que se hereda de ApplicationRecord

p = Person.where(id:10).limit(1) 

Devuelve sólo el resultado de la consulta, no del objeto.

Puede comprobarlo mediante el uso de

p.class # => It reurns Nilclass which means its not at all a class 

Así no se puede utilizar p.last_name o p.first_name en la pág.

Cuestiones relacionadas