1

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

简单地将 gems 和适配器切换到 postgres 是不够的:我现在收到以下错误:

ActionView::Template::Error (PG::Error: ERROR: column "shoes.id" 必须出现在 GROUP BY 子句中或用于聚合函数 LINE 1: SELECT "shoes"."id" AS t0_r0, "鞋”。“created_at”AS ...

我试着改变

.group("purchases.shoe_id")

.group("purchases.shoe_id, shoes.id, purchases.id")

虽然这消除了错误,但它也改变了 sql 并破坏了我的一些测试。

我已经阅读了许多有关此错误的 stackoverflow 问题,但我无法找到解决方案。我需要在我的 ActiveRecord 查询中进行哪些更改才能使其在 postgres 中工作?

提前致谢!

4

1 回答 1

1

你找到解决方案了吗?如果不尝试:

Shoe.where("not exists ( select 1 from purchases where shoe_id = shoes.id offset ? limit 1)", num_in_stock - 1)

大 num_in_stock 会很慢,你应该在 purchase.shoe_id 列上有索引。

我认为除非您已经计算过购买量,否则大桌子上没有快速的解决方案。

编辑

考虑使用 counter_cache 或counter_culture gem

于 2012-10-29T08:58:20.580 回答