Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 不同列值的字符串值出现次数_Ruby_Ruby On Rails 3_Activerecord - Fatal编程技术网

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

Ruby 不同列值的字符串值出现次数,ruby,ruby-on-rails-3,activerecord,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

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

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

我没有得到散列值。

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

您可以使用以下查询:

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,
  ...
}

其他人可能有更好的方法,但似乎这会让你离得很近。

谢谢@dinjas。我们是否可以不使用列计数器而获得相同类型的结果?@Vinay Yea,您应该能够执行
counter.group([:name,:flowers])。count
非常感谢@dinjas。这很有效。你能建议使用正则表达式将名字从vino_rose拆分为vino吗?@Vinay,这取决于你用它做什么。如果您只需要拆分它,您可以先执行
name=“vino_rose”.split(“”);flower=“vino_rose”.split(“”).last
您可以使用正则表达式查看字符串是否包含子字符串,如
“vino_rose”=~/vino/
(将返回匹配发生在字符串中的索引,在本例中为
0
,如果不匹配则为
nil
)。您也可以使用
“vino_rose”。包括?(“vino”)
,它将返回
true
false
非常感谢您,非常感谢您的解释帮助我清楚地理解。谢谢