ActiveRecord trova e restituisce solo le colonne selezionate


91

modifica 2

Se ti imbatti in questo, controlla entrambe le risposte poiché ora userei il coraggio per questo


Ho un set di dati personalizzato abbastanza grande che vorrei restituire per essere echeggiato come json. Una parte è:

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

ma mi piacerebbe fare qualcosa come:

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

ma questo non sembra funzionare. Come posso farlo funzionare?

grazie

modifica 1 in
alternativa, c'è un modo per passare un array di soli attributi che voglio includere?

Risposte:


87

In Rails 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])

Questo documento di riferimento fornisce l'intero elenco di opzioni che puoi utilizzare .find, incluso come limitare per numero, ID o qualsiasi altra colonna / vincolo arbitrario.

In Rails 3 con ActiveRecord Query Interface

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

Rif: Active Record Query Interface

Puoi anche scambiare l'ordine di queste chiamate concatenate, facendo .select(...).where(...).firsttutto ciò che fanno è costruire la query SQL e poi inviarla.


ma voglio solo una singola istanza, non tutte
timpone

Ho modificato la mia risposta. :limitdovrebbe fare questo, o :firsto :lasto qualsiasi altra cosa, a seconda di ciò che vuoi. Il documento di riferimento a cui mi sono collegato ti dirà come fare tutto ciò.
jefflunt

Aggiornato per includere come eseguire una query equivalente in Rails 3.
jefflunt

206

cogliere (nome_colonna)

Questo metodo è progettato per eseguire la selezione da una singola colonna come query SQL diretta. Restituisce Array con valori del nome di colonna specificato I valori hanno lo stesso tipo di dati della colonna.

Esempi:

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)

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

Ha introdotto le guide 3.2 in poi e accetta solo una singola colonna. In rails 4, accetta più colonne


1
OK, cogliere più colonne è fantastico .. l'ho appena imparato in questa risposta. Rails 3 però necessita della risposta accettata.
Jay Shepherd

La risposta accettata è giusta perché allora il coraggio non era disponibile.
prasad.surase

User.pluck (: email,: id) SELEZIONA "utenti". "Email", "utenti". "Id" DA "utenti"
pranav prashant

2
Model.uniq è ora Model.distinct (almeno in Rails 5).
mrturtle

Sembra che tu possa fare quanto segue in rails 3.2: Location.select([:name, :website, :city])se gli passi un array
CTS_AE

27

La mia risposta arriva abbastanza tardi perché sono uno sviluppatore abbastanza nuovo. Questo è quello che puoi fare:

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

A proposito, questo è Rails 4


Questa dovrebbe essere la risposta selezionata e la risposta più diretta alla domanda.
Michael Wiltbank
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.