rails / activerecord:如何让SQL COUNT和SUM与Postgres一起使用(在heroku)

时间:2012-02-05 11:50:27

标签: sql postgresql heroku

我的rails 3 app需要使用SELECT DISTINCT(据我所知)无法使用activerecord查询。所以我一直在执行直接SQL,它在sqllite上本地运行正常 - 但它在Heroku(postgres)失败了。

在我的本地(sqllite)应用中,这很好用:

r = ActiveRecord::Base.connection.execute("my query string")

但是在heroku上,使用ActiveRecord :: Base.connection.execute ALWAYS返回一个空数据集

#<PGresult:0x0000000xxxxxxxxx>

即使是非常简单的查询,例如

r = ActiveRecord::Base.connection.execute("SELECT numeric_score  FROM beeps WHERE store_id = '132' AND survey_num = '2'")

所以我正在使用heroku console调试一些非常基本的SQL查询,试图了解如何重新格式化我的SQL以便在Heroku / Postgres中工作。

SELECT column_name WORKS:heroku控制台,选择postgres记录没问题,例如这样可以正常工作:

n = Beep.find_by_sql("SELECT numeric_score  FROM beeps WHERE store_id = '132' AND survey_num = '2'")

给出了预期的三个值:

[#<Beep numeric_score: 10>, #<Beep numeric_score: 9>, #<Beep numeric_score: 8>]

SELECT COUNT失败了?当我尝试在SQL

中计算它们时
n = Beep.find_by_sql("SELECT COUNT(*)  FROM beeps WHERE store_id = '132' AND survey_num = '2'")

它失败了,给出了:

[#<Beep >]

SELECT SUM(column)也失败了?当我尝试SUM它们时

n = Beep.find_by_sql("SELECT SUM(numeric_score)  FROM beeps WHERE store_id = '132' AND survey_num = '2'")

它也失败了,给出了:

[#<Beep >]

如何使用Postgres执行直接SQL ... SUM(columnname)和COUNT(*)应该可以正常工作,对吗?

2 个答案:

答案 0 :(得分:6)

这里有几件事。

首先,find_by_sql会根据返回的数据返回初始化对象,这就是为什么您没有看到任何从您的计数中返回的内容。

为了使用AR执行此操作,您可以执行以下操作:

Beep.where(:store_id => 123).where(:survey_num => 2).count
=> 5

这将返回一个数字。它与总和相同:

Beep.where(:store_id => 123).where(:survey_num => 2).sum(:numeric_score)
=> 5

你也可以使用与AR的区别,但它不是那么干净:

Beep.select("DISTINCT *").where(:store_id => 123).where(:survey_num => 2)
=> [<Beep>, <Beep>...etc]

为了直接查询数据库,这仍然是可能的,你几乎就在那里:

conn = ActiveRecord::Base.connection
sql = "SELECT DISTINCT * FROM beeps WHERE store_ID = 123"
res = conn.execute sql

# res is now a PGResult object

res.each do |row|
  puts row["id"]
  puts row["numeric_score"]
end

答案 1 :(得分:1)

您可以将uniq方法添加到ActiveRecord关系中,将DISTINCT添加到SELECT

Beep.where(:store_id => 123).where(:survey_num => 2).uniq

另请参阅:http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-uniq