枚举Ruby中的Postgres结果集

ket 发布于 5 天前 postgresql 最后更新 5 天前 9 浏览

我可以运行任何SQL,并将结果作为列的散列,或者a set of Postgres tuples(包含每个元组的散列)。 我不确定如何使用Postgres结果集,尤其是以惯用的类Ruby方式工作。 这是我的代码:

sql = "select status, count(*) from batch_details where batch_id = 950 group by status"
status_counts = ActiveRecord::Base.connection.execute(sql)
我必须遍历结果集并按名称访问每个元素:
status_counts.each do |st|
  puts st
  puts st['count']
end
{"status"=>"new", "count"=>"2"}
2
{"status"=>"ready", "count"=>"23"}
23
{"status"=>"processing", "count"=>"177"}
177
{"status"=>"complete", "count"=>"50"}
50
{"status"=>"error", "count"=>"50"}
50
无法将结果集转换为散列数组:
2.1.1 :031 > arr = status_counts.to_array
NoMethodError: undefined method `to_array' for #<PG::Result:0x000000097f17b0>
同样的事情试图将结果集转换为哈希散列值:
2.1.1 :032 > hsh = status_counts.to_hash
NoMethodError: undefined method `to_hash' for #<PG::Result:0x000000097f17b0>
我在尝试着:
  • 针对(大型)分组运行查询
  • 通过排除某些值来确定完成的处理%
使用上面的哈希值,我想排除'新'和'准备'状态,加起来除以总数:
(177 + 50 + 50 / 2 + 23 + 177 + 50 + 50) * 100
我的代码到目前为止:
status_counts.each {|st| total += st['count'].to_i} => works
但它不起作用:
status_counts.each do |st|
  ['processing','complete','error'].include? st['status'] do
       total2 += st['count'].to_i
   end
end
pct = total2/total * 100
  • 我如何更轻松地使用Postgres结果集?
  • 如何以“Ruby方式”执行此任务?
已邀请:

saut

赞同来自:

不是我自己的问题的确切答案,但对于试图迭代Postgres结果集的任何人来说都是有用的信息:

sql = "update batch_details set status = 'processing' " +
      "where status in ('ready','processing','failed') " +
      "and batch_id = #{batch_id} " +
      "returning id"
batch_detail_ids = []
res = ActiveRecord::Base.connection.execute(sql)   
# TODO needs some error checking  
res.each{|tuple| batch_detail_ids << tuple['id'].to_i}

nipsa

赞同来自:

也许这样的事情?:

status_counts.
  select { |tuple| %w(processing complete error).include?(tuple['status']) }.
  inject(0) { |memo, tuple| memo += tuple['count'].to_i }
第一步过滤结果集以获得所需的元组;第二步总结了所选元组的计数。 PGResult在Enumerable中混合,因此它应该与select / inject一起使用。