web-dev-qa-db-fra.com

ActiveRecord recherche et renvoie uniquement les colonnes sélectionnées

éditer 2

Si vous tombez sur cela, vérifiez les deux réponses car je voudrais maintenant utiliser plumer pour cela


J'ai un ensemble de données personnalisé assez volumineux que j'aimerais renvoyer en tant que fichier json. Une partie est:

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

mais j'aimerais faire quelque chose comme:

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

mais cela ne semble pas fonctionner. Comment pourrais-je le faire fonctionner?

merci

edit 1
Sinon, y a-t-il un moyen de transmettre uniquement un tableau des attributs que je veux inclure?

83
timpone

Dans Rails 2

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

...ou...

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

Cette documentation de référence vous donne la liste complète des options que vous pouvez utiliser avec .find, Y compris comment limiter par numéro, id ou toute autre colonne/contrainte arbitraire.

Dans Rails 3 avec l'interface de requête ActiveRecord

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

Réf.: Interface de requête d'enregistrement actif

Vous pouvez également permuter l'ordre de ces appels chaînés en faisant .select(...).where(...).first - tous ces appels ne font que construire la requête SQL puis l'envoyer.

81
jefflunt

plumer (nom_colonne)

Cette méthode est conçue pour effectuer une sélection sur une seule colonne en tant que requête SQL directe. Array de tableau avec les valeurs du nom de colonne spécifié. Les valeurs ont le même type de données que la colonne.

Exemples:

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)

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

Son introduction Rails 3.2 et accepte uniquement une colonne. Dans Rails 4, il accepte plusieurs colonnes

201
prasad.surase

Ma réponse arrive assez tard, car je suis un tout nouveau développeur. Voici ce que vous pouvez faire:

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

Btw, c'est Rails 4

14
tkhuynh