我一直在使用一个ActiveRecord查询(这里是历史记录),它在MySQL中运行得很好,但现在我需要将数据库转换为PostgreSQL,我遇到了一个错误。以下是查询:
class Shoe < ActiveRecord::Base
has_many :purchases
def self.available_shoes
#show all shoes that have been purchased less than num_in_stock
num_in_stock = 3
Shoe.includes(:purchases)
.group("purchases.shoe_id")
.having("COUNT(purchases.shoe_id) < ?", num_in_stock)
end
end
仅仅将gem和适配器切换到postgres是不够的:我现在得到以下错误:
ActionView::Template::Error(PG::Error:Error:列"shoes.id"必须出现在GROUP BY子句中或在聚合函数中使用第1行:选择"鞋"。"id"AS t0_r0,"鞋"。"created_at"AS。。。
我试着换
.group("purchases.shoe_id")
至
.group("purchases.shoe_id, shoes.id, purchases.id")
虽然这消除了错误,但它也更改了sql并破坏了我的一些测试。
我读过很多关于这个错误的堆叠式问题,但我无法找到解决方案。我需要在ActiveRecord查询中更改什么才能在postgres中工作?
提前感谢!
您找到解决方案了吗?如果不尝试:
Shoe.where("not exists ( select 1 from purchases where shoe_id = shoes.id offset ? limit 1)", num_in_stock - 1)
对于大的num_in_stock来说,它会很慢,并且您应该在purchases.shoe_id列上有索引。
我认为,除非你已经计算过购买量,否则对于大桌子没有快速的解决方案。
编辑
考虑使用counter_cache或counter_culture gem