如何将单个列的值放入数组中

fra*_*ine 77 ruby ruby-on-rails ruby-on-rails-3

现在我正在做这样的事情来选择一列数据:

points = Post.find_by_sql("select point from posts")
Run Code Online (Sandbox Code Playgroud)

然后将它们传递给方法,我希望我的方法保持不可知,现在必须从我的方法中调用hash.point.如何快速将其转换为数组并将数据集传递给我的方法,还是有更好的方法?

alo*_*ony 183

在Rails 3.2有一个拔毛方法对本

像这样:

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)
Run Code Online (Sandbox Code Playgroud)

uniq和distinct之间的区别

  • 要采用id,有一种特殊的方法:`Person.ids`. (6认同)
  • Post.order(:得分).pluck(:得分)是解决方案.谢谢. (3认同)

Pat*_*ity 15

您应该使用pluck@alony建议的方法.如果你在Rails 3.2之前被卡住了,你可以使用ActiveRecord select方法Array#map:

Post.select(:point).map(&:point)
#=> ["foo", "bar", "baz"] 
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.9之前,您必须这样做.map{|x| x.title},因为Symbol#to_proc(由一元运算&符别名)未在早期版本的Ruby中定义.


Vik*_*Vik 5

如果你看到select_values的定义,那么它使用'map(&:field_name)'

  def select_values(arel, name = nil)
    result = select_rows(to_sql(arel), name)
    result.map { |v| v[0] }
  end
Run Code Online (Sandbox Code Playgroud)

收集数组中所有字段值的常用和常规Rails方法如下:

points = Post.all(:select => 'point').map(&:point)
Run Code Online (Sandbox Code Playgroud)