En ce moment, je fais quelque chose comme ceci pour sélectionner une seule colonne de données:
points = Post.find_by_sql("select point from posts")
Puis, en les passant à une méthode, j'aimerais que ma méthode reste agnostique et que je doive maintenant appeler hash.point depuis ma méthode. Comment puis-je convertir rapidement cela en un tableau et transmettre le jeu de données à ma méthode, ou existe-t-il un meilleur moyen?
Dans Rails 3.2 il existe une méthode de pluck) pour cette
Juste comme ça:
Person.pluck(:id) # SELECT people.id FROM people
Person.pluck(:role).uniq # unique roles from array of people
Person.distinct.pluck(:role) # SELECT DISTINCT role FROM people SQL
Person.where(:confirmed => true).limit(5).pluck(:id)
Vous devriez utiliser la méthode pluck
comme suggéré par @alony. Si vous êtes bloqué avant Rails 3.2, vous pouvez utiliser la méthode ActiveRecord select
avec Array#map
:
Post.select(:point).map(&:point)
#=> ["foo", "bar", "baz"]
avant Ruby 1,9 il faudrait faire .map{|x| x.title}
cependant, parce que Symbol#to_proc
_ (alias par le unaire &
opérateur) n'est pas défini dans les versions antérieures de Ruby.
Si vous voyez la définition de select_values, utilisez-la avec 'map (&: field_name)'
def select_values(arel, name = nil)
result = select_rows(to_sql(arel), name)
result.map { |v| v[0] }
end
Le moyen commun et général Rails de collecter toutes les valeurs de champs dans un tableau ressemble à ceci:
points = Post.all(:select => 'point').map(&:point)
points = Post.all.collect {|p| p.point}