现在,我正在执行以下操作以选择单列数据:
points = Post.find_by_sql("select point from posts")
然后将它们传递给方法,我希望我的方法保持不可知,现在必须从我的方法中调用hash.point。如何快速将其转换为数组并将数据集传递给我的方法,还是有更好的方法?
Answers:
在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)
Person.ids
。
distinct
而不是uniq
:soPerson.distinct.pluck(:role)
您应该使用pluck
@alony建议的方法。如果您在Rails 3.2之前陷入困境,则可以将ActiveRecordselect
方法与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
语句仅获取指定的列。