Ahora mismo estoy haciendo algo como esto para seleccionar una sola columna de datos:
points = Post.find_by_sql("select point from posts")
Luego, pasándolos a un método, me gustaría que mi método permaneciera agnóstico y ahora tengo que llamar a hash.point desde dentro de mi método. ¿Cómo puedo convertir esto rápidamente en una matriz y pasar el conjunto de datos a mi método, o hay una mejor manera?
ruby-on-rails
ruby
ruby-on-rails-3
franklin stine
fuente
fuente
Person.ids
.distinct
lugar deuniq
: entoncesPerson.distinct.pluck(:role)
Deberías usar el
pluck
método como sugirió @alony. Si está atascado antes de Rails 3.2, puede usar elselect
método ActiveRecord junto conArray#map
:Post.select(:point).map(&:point) #=> ["foo", "bar", "baz"]
.map{|x| x.title}
sin embargo, antes de Ruby 1.9 tendrías que hacerlo , porqueSymbol#to_proc
(alias por el&
operador unario ) no está definido en versiones anteriores de Ruby.fuente
Si ve la definición de select_values, entonces use 'map (&: field_name)'
def select_values(arel, name = nil) result = select_rows(to_sql(arel), name) result.map { |v| v[0] } end
La forma común y general de Rails para recopilar todos los valores de los campos en una matriz es como:
points = Post.all(:select => 'point').map(&:point)
fuente
Post.select(:point).limit(1)
realizaSELECT point FROM "posts" LIMIT 1
mientras quePost.all(:select => :point).limit(1)
aumenta aNoMethodError
. Por favor corrígeme si estoy equivocado.points = Post.all.collect {|p| p.point}
fuente
select
declaración solo recupera las columnas especificadas.