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?

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.


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


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


Esta debe ser la respuesta seleccionada y responde más directamente a la pregunta.
Michael Wiltbank
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.