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

时间:2012-03-26 09:43:10

标签: ruby-on-rails ruby ruby-on-rails-3

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

points = Post.find_by_sql("select point from posts")

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

4 个答案:

答案 0 :(得分:182)

在Rails 3.2中,这个

有一个pluck method

就像这样:

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)

Difference between uniq and distinct

答案 1 :(得分:15)

您应该使用@alony建议的pluck方法。如果您在Rails 3.2之前遇到困难,可以将ActiveRecord select方法与Array#map一起使用:

Post.select(:point).map(&:point)
#=> ["foo", "bar", "baz"] 

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

答案 2 :(得分: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

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

points = Post.all(:select => 'point').map(&:point)

答案 3 :(得分:2)

points = Post.all.collect {|p| p.point}