【发布时间】:2012-03-26 09:43:09
【问题描述】:
现在我正在做这样的事情来选择单列数据:
points = Post.find_by_sql("select point from posts")
然后将它们传递给一个方法,我希望我的方法保持不可知,现在必须从我的方法中调用 hash.point。如何快速将其转换为数组并将数据集传递给我的方法,还是有更好的方法?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3
现在我正在做这样的事情来选择单列数据:
points = Post.find_by_sql("select point from posts")
然后将它们传递给一个方法,我希望我的方法保持不可知,现在必须从我的方法中调用 hash.point。如何快速将其转换为数组并将数据集传递给我的方法,还是有更好的方法?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3
在 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)
【讨论】:
Person.ids.
distinct 而不是uniq:所以Person.distinct.pluck(:role)
您应该按照@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_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)
【讨论】:
Post.select(:point).limit(1) 执行 SELECT point FROM "posts" LIMIT 1 而Post.all(:select => :point).limit(1) 提出了NoMethodError。如果我错了,请纠正我。
points = Post.all.collect {|p| p.point}
【讨论】:
select 语句仅获取指定的列。