En ce moment, je fais quelque chose comme ça pour sélectionner une seule colonne de données:
points = Post.find_by_sql("select point from posts")
En les transmettant ensuite à une méthode, j’aimerais que ma méthode rest agnostique et que je doive maintenant appeler hash.sharepointpuis ma méthode. Comment puis-je rapidement convertir 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 pincement
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
Vous devriez utiliser la méthode de pincement comme suggéré par @alony. Si vous êtes bloqué avant Rails 3.2, vous pouvez utiliser la méthode de select
ActiveRecord avec Array#map
:
Post.select(:point).map(&:point) #=> ["foo", "bar", "baz"]
avant Ruby 1.9 vous devriez faire .map{|x| x.title}
.map{|x| x.title}
, car le Symbol#to_proc
(alias par l’opérateur unaire &
opérateur) n’est pas défini dans les versions antérieures de Ruby.
Si vous voyez la définition de select_values, alors elle utilise ‘map (&: field_name)’
def select_values(arel, name = nil) result = select_rows(to_sql(arel), name) result.map { |v| v[0] } end
La méthode Rails commune et générale pour collecter toutes les valeurs de champs du tableau est la suivante:
points = Post.all(:select => 'point').map(&:point)
points = Post.all.collect {|p| p.point}