ActiveRecord busca y solo devuelve columnas seleccionadas

89

editar 2

Si se encuentra con esto, verifique ambas respuestas, ya que ahora usaría pluck para esto


Tengo un conjunto de datos personalizado bastante grande que me gustaría volver para que se repita como json. Una parte es:

l=Location.find(row.id)
tmp[row.id]=l

pero me gustaría hacer algo como:

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

pero esto no parece funcionar. ¿Cómo puedo hacer que esto funcione?

gracias

editar 1
alternativamente, ¿hay alguna manera de que pueda pasar una matriz de solo los atributos que quiero incluir?

timpone
fuente

Respuestas:

86

En rieles 2

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

...o...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

Este documento de referencia le brinda la lista completa de opciones con las que puede usar .find, incluido cómo limitar por número, id o cualquier otra columna / restricción arbitraria.

In Rails 3 con interfaz de consulta ActiveRecord

l = Location.where(["id = ?", id]).select("name, website, city").first

Ref: Interfaz de consulta de registros activos

También puede cambiar el orden de estas llamadas encadenadas, haciendo .select(...).where(...).first- todo lo que hacen estas llamadas es construir la consulta SQL y luego enviarla.

jefflunt
fuente
pero solo quiero una instancia única, no todas
timpone
Edité mi respuesta. :limitdebe hacer esto, o :firsto :lasto lo que sea, dependiendo de lo que desee. El documento de referencia al que vinculé le dirá cómo hacer todo eso.
jefflunt
Actualizado para incluir cómo hacer una consulta equivalente en Rails 3.
jefflunt
205

arrancar (nombre_columna)

Este método está diseñado para realizar la selección mediante una sola columna como consulta SQL directa. Devuelve Matriz con valores del nombre de columna especificado. Los valores tienen el mismo tipo de datos que la columna.

Ejemplos:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

ver http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

Sus rieles introducidos 3.2 en adelante y acepta solo una columna. En rails 4, acepta múltiples columnas

prasad.surase
fuente
1
OK, arrancar con múltiples columnas es increíble ... acabo de aprender eso en esta respuesta. Rails 3, sin embargo, necesita la respuesta aceptada.
Jay Shepherd
La respuesta aceptada es correcta, porque entonces no estaba disponible el pluck.
prasad.surase
User.pluck (: email,: id) SELECT "users". "Email", "users". "Id" FROM "users"
pranav prashant
2
Model.uniq ahora es Model.distinct (al menos en Rails 5).
mrturtle
Parece que puede hacer lo siguiente en rieles 3.2: Location.select([:name, :website, :city])si le pasa una matriz
CTS_AE
24

Mi respuesta llega bastante tarde porque soy un desarrollador bastante nuevo. Esto es lo que puedes hacer:

Location.select(:name, :website, :city).find(row.id)

Por cierto, esto es Rails 4

tkhuynh
fuente
Esta debe ser la respuesta seleccionada y responde más directamente a la pregunta.
Michael Wiltbank