我的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(*)应该可以正常工作,对吗?
答案 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