不同的另一列值的字符串值出现次数

时间:2015-12-08 21:48:42

标签: ruby ruby-on-rails-3 activerecord

我有一个模型计数器,它返回以下记录:

name.....flowers.....counter  
vino.....rose.........1
vino.....lily.........1 
gaya.....rose.........1 
rosi.....lily.........1 
vino.....lily.........1 
rosi.....rose.........1 
rosi.....rose.........1 

我希望在表格中显示:

name | Rose | Lily |
---------------------
Vino |  1   | 2    |
---------------------
Gaya |  1   | 0    |
---------------------
Rosi |  2   | 1    |

我想显示每个不同名称的鲜花数量。我尝试过以下内容并想知道如何才能优雅地完成它?

def counter_results
  @counter_results= {}
  Counter.each do |name|
    rose = Counter.where(flower: 'rose').count
    lily= Counter.where(flower: 'lily').count
    @counter_results['name'] = name
    @counter_results['rose_count'] = rose
    @counter_results['lily_count'] = lily
  end
  return @counter_results
end

我没有得到哈希值。

1 个答案:

答案 0 :(得分:2)

这会给你略微不同的输出,但我认为它可能比你所展示的更接近你想要的东西。

您可以使用查询:

Counter.group([:name, :flowers]).sum(:counter)

获得如下所示的结果集:

{ ["vino", "rose"] => 1, ["vino", "lily"] => 2, ["gaya", "rose"] => 1, ["gaya", "lily"] => 0, ... }

你可以做这样的事情来生成哈希:

def counter_results
  @counter_results = {}
  Counter.group([:name, :flowers]).sum(:counter).each do |k, v|
    @counter_results[k.join("_")] = v
  end
  @counter_results
end

结果哈希看起来像这样:

{
  "vino_rose" => 1,
  "vino_lily" => 2,
  "gaya_rose" => 1,
  "gaya_lily" => 0,
  ...
}

其他人可能有更好的方法来做到这一点,但似乎应该让你非常接近。