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

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

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

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

79889 次浏览
points = Post.all.collect {|p| p.point}

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

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

但是,在 Ruby 1.9之前,您必须使用 .map{|x| x.title},因为在 Ruby 的早期版本中没有定义 Symbol#to_proc(由一元 &操作符别名)。

如果您看到 select _ value 的定义,那么它使用‘ 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)

在 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)

Uniq 和 different 之间的区别