现在我正在做类似的事情来选择一列数据:
points = Post.find_by_sql("select point from posts")
然后将它们传递给一个方法,我希望我的方法保持不可知性,现在必须从我的方法中调用 hash.point。如何快速将其转换为数组并将数据集传递给我的方法,还是有更好的方法?
points = Post.all.collect {|p| p.point}
您应该按照@alony 的建议使用 pluck方法。如果你在 Rails 3.2之前卡住了,你可以使用 ActiveRecord select方法和 Array#map:
pluck
select
Array#map
Post.select(:point).map(&:point) #=> ["foo", "bar", "baz"]
但是,在 Ruby 1.9之前,您必须使用 .map{|x| x.title},因为在 Ruby 的早期版本中没有定义 Symbol#to_proc(由一元 &操作符别名)。
.map{|x| x.title}
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 之间的区别