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

jpw*_*ynn 1 sql postgresql heroku

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

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

r = ActiveRecord::Base.connection.execute("my query string")
Run Code Online (Sandbox Code Playgroud)

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

#<PGresult:0x0000000xxxxxxxxx>
Run Code Online (Sandbox Code Playgroud)

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

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

因此,我正在使用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'")
Run Code Online (Sandbox Code Playgroud)

给出了预期的三个值:

[#<Beep numeric_score: 10>, #<Beep numeric_score: 9>, #<Beep numeric_score: 8>]
Run Code Online (Sandbox Code Playgroud)

但是SELECT COUNT失败了?当我尝试在SQL中对它们进行COUNT时

n = Beep.find_by_sql("SELECT COUNT(*)  FROM beeps WHERE store_id = '132' AND survey_num = '2'")
Run Code Online (Sandbox Code Playgroud)

它失败了,给出:

[#<Beep >]
Run Code Online (Sandbox Code Playgroud)

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

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

它也失败了,给出:

[#<Beep >]
Run Code Online (Sandbox Code Playgroud)

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

Nei*_*ton 7

这里有几件事.

首先,find_by_sql将根据返回的数据返回初始化对象,这就是为什么你没有看到任何从你的计数中回来的东西.

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

Beep.where(:store_id => 123).where(:survey_num => 2).count
=> 5
Run Code Online (Sandbox Code Playgroud)

这将返回一个数字.总和是一样的:

Beep.where(:store_id => 123).where(:survey_num => 2).sum(:numeric_score)
=> 5
Run Code Online (Sandbox Code Playgroud)

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

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

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

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
Run Code Online (Sandbox Code Playgroud)