选择带有group by的小写列或选择Rails 4中的lower(列)

时间:2015-05-13 13:26:27

标签: ruby-on-rails ruby postgresql ruby-on-rails-4

如何在rails 4中实现以下功能?

这是我的PostgreSQL查询并且可以正常工作

SELECT lower(name) as c_name, count(*) as cc FROM categories  GROUP BY c_name  ORDER BY cc desc LIMIT 3

Ii给了我以下结果

 "ecommerce solutions";6
 "vmware";6
 "big data analytics";5

但是当我在Rails 4中编写相同的查询时

Category.select("lower(name) as c_name, count(*) as cc").group("c_name").order("cc desc").limit(3) 

以上查询生成以下查询,该查询与上述PostgreSQL查询相同

SELECT lower(name) as c_name, count(*) as cc FROM "categories"  GROUP BY c_name  ORDER BY cc desc LIMIT 3

给出以下结果

[#<Category id: nil>, #<Category id: nil>, #<Category id: nil>]

为什么会这样?当我将查询剪切为

 Category.select("lower(name)").limit(3)

这也不起作用,并导致

 [#<Category id: nil>, #<Category id: nil>, #<Category id: nil>]

我想在lower(name)上进行分组计数作为聚合,我在name模型中有Category的差异很多

实施例。数据集

"Vmware" and "VMware" and "VMWARE" and "vmware" 

如何在Rails 4中对lower(name)进行分组?

简单来说,如何在Rails 4中编写以下等效查询?

SELECT lower(name) as c_name, count(*) as cc FROM categories  GROUP BY c_name  ORDER BY cc desc LIMIT 3

1 个答案:

答案 0 :(得分:4)

结果是正确的,但Rails显示错误。只需手动访问结果:

results = Category.select("lower(name) as c_name, count(*) as cc").group("c_name").order("cc desc").limit(3) 
results.first['c_name']