1

MySQL でうまく動作する ActiveRecord クエリ (history here ) を使用していますが、データベースを 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: column "shoes.id" must appear in the GROUP BY clause or be used in agregate function LINE 1: SELECT "shoes"."id" AS t0_r0, " shoes"."created_at" AS ...

変えてみた

.group("purchases.shoe_id")

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

これによりエラーが解消されましたが、SQLも変更され、テストの一部が壊れました。

このエラーに関する多くのスタックオーバーフローの質問を読みましたが、解決策を見つけることができませんでした. これをpostgresで機能させるには、ActiveRecordクエリで何を変更する必要がありますか?

前もって感謝します!

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 が大きいと遅くなり、 purchases.shoe_id 列にインデックスが必要です。

すでに購入を数えていない限り、大きなテーブルでの迅速な解決策はないと思います。

編集

counter_cache またはcounter_culture gemの使用を検討してください

于 2012-10-29T08:58:20.580 に答える