web-dev-qa-db-fra.com

Comment obtenir les valeurs d'une seule colonne dans un tableau

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?

77
franklin stine

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)

Différence entre uniq et distinct

182
alony

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.

15
Patrick Oscity

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)
5
Vik
points = Post.all.collect {|p| p.point}
2
rajibchowdhury