如何将单列的值放入数组


80

现在,我正在执行以下操作以选择单列数据:

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

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

Answers:


190

在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和distinct之间的区别


数组如何通过pluck继承查询结果的顺序?
富兰克林·史汀(Franklin Stine)2012年

3
Post.order(:score).pluck(:score)是解决方案。谢谢。
富兰克林·史汀妮(Franklin Stine)2012年

6
要提取ID,有一种特殊的方法:Person.ids
shock_one 2014年

还可以查看Ernie Miller的宝石Valium github.com/ernie/valium,特别是如果您使用的是较旧的Rails或想要多个列
James Daniels

从Rails 5.0开始,现在建议使用distinct而不是uniq:soPerson.distinct.pluck(:role)
David

15

您应该使用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(由一元运算&符别名)。


谢谢。我看到您对新的Pluck方法发表了评论。你可以这样做吗?
富兰克林·史汀(Franklin stine)2012年

是的,如果您仔细阅读@alony的答案,您会发现她已经包含了执行此操作的示例。
Patrick Oscity 2012年

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)

好点子。谢谢。这很好用,并且与Post.select示例不同,让我仍然可以对查询应用订单和其他内容。
富兰克林·史汀(Franklin stine)2012年

我不同意@franklinstine:Post.select(:point).limit(1)执行,SELECT point FROM "posts" LIMIT 1Post.all(:select => :point).limit(1)引发NoMethodError。如果我错了,请纠正我。
Patrick Oscity 2012年

我同意你的意见。但是我在帖子中没有提到要使用的地方:Post.all(:select =>:point).limit(1)当然,它将给出错误“未定义的方法'limit'”
Vik 2012年

@franklinstine说他喜欢您的方法,因为他可以在此之后链接其他语句,我只是想表明这是不正确的
Patrick Oscity 2012年

是的,@ padde您误解了。我说的是您仍然可以应用订单和其他查询语句,例如:Post.all(:select =>'score',:order =>'score ASC')。map(&:score)。
富兰克林·史汀(Franklin Stine)2012年

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

2
这可行,但是您可以从数据库中选择所有字段,然后在Ruby中过滤结果,而该select语句仅获取指定的列。
Patrick Oscity 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.