将Rails ActiveRecord GROUP查询从MySQL转换为PostgreSQL



我一直在使用一个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

相关内容

  • 没有找到相关文章

最新更新