1

mysqlを使用してアプリケーションを開発していますが、Herokuを使用してデプロイしているため、PGを使用する必要があります。

次のステートメントに問題があります。

<% current_user_savings = Saving.where{user_id == my{current_user}} %>      

<% @latest_savings =  Saving.where{product_id.not_in(current_user_savings.select{product_id})}.group{product_id} %>

したがって、私のコンピューターでは機能しますが、herokuにデプロイすると、次の問題が発生します。

ActionView::Template::Error (PGError: ERROR:  column "savings.id" must appear in the GROUP      BY clause or be used in an aggregate function
LINE 1: SELECT "savings".* FROM "savings"  WHERE "savings"."product_...
SELECT "savings".* FROM "savings"  WHERE "savings"."product_id" NOT IN (SELECT "savings"."product_id" FROM "savings"  WHERE "savings"."user_id" = 1) GROUP BY "savings"."product_id"):

それを修正してherokuで動作させる方法が本当にわかりません。

要求に応じたGemfile:ソース'https://rubygems.org'

ruby '1.9.3'
gem 'rails', '3.2.7'
gem 'compass_twitter_bootstrap', '2.0.3'
gem 'bcrypt-ruby', '3.0.1'
gem 'faker', '1.0.1'
gem 'will_paginate', '3.0.3'
gem 'bootstrap-will_paginate', '0.0.6'
gem 'omniauth-facebook', '1.4.0'
gem 'railroady'
gem 'devise', '2.1.2'
gem 'devise_invitable'
gem 'simple_form'
gem "mongoid", "~> 3.0.0"
gem 'thin'
gem 'best_in_place'
gem "jquery-fileupload-rails"
gem 'paperclip'
gem "squeel"
gem 'client_side_validations'
gem 'wicked'
gem 'koala'
gem 'aws-sdk'
gem 'bson_ext'


group :development, :test do
    gem 'sqlite3'
end
group :development, :test do
    gem 'annotate', '2.5.0'
end

group :test, :development do
    gem 'rspec-rails'
end

group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'compass-rails', '1.0.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
gem 'jquery-ui-rails'

group :test do
    gem 'capybara'
    gem 'factory_girl_rails'
end

group :production do
    gem 'pg', '0.12.2'
end 
4

4 に答える 4

1

GROUP BYこれは、ユーザーがMySQLからPostgreSQLに移行する際の既知の問題点です。

@rsが指摘しているように、SQLには多少問題があります。

主キーでグループ化する場合

これが主キーであると仮定するとsavings.product_id、このクエリが正しい唯一の方法であるため、主キーは一意であるため、主キーによるグループ化はすべてのフィールドを暗黙的にグループ化することを知っているデータベースに依存します。

MySQLはそれを認識していません。先に進んで、各フィールドで最初に表示される結果を選択します。この場合、主キーでグループ化しているので正しいでしょうが、他の状況では予測できない結果を簡単に生み出す可能性があります。

PostgreSQL 9.0以下では、SQL-99標準でグループ化が要求されているにもかかわらず、主キーによるグループ化がすべてのフィールドのグループ化を意味することを認識していませんこれらのバージョンでは、に必要なすべてのフィールドをリストする必要がありSELECTますGROUP BY。これは不器用なので、できる最善のことはPostgreSQL 9.1または9.2にアップグレードすることです。これらは、この制限の対象ではなくなりました

クエリジェネレータを使用しているため、これへの対処はさらに複雑になります。SQLを変更するだけでは不十分です。PostgreSQLをアップグレードできない場合は、クエリジェネレータをGROUP BYテーブル内のすべての列に納得させる方法を検討する必要があります。

他のフィールドでグループ化する場合

が主キーでない場合savings.product_id、クエリはまったく間違っています。一意で明確な結果を保証するために、SELECTリストに必要なすべてのフィールドをリストするか、集計関数内のフィールドのみを参照する必要があります。GROUP BY

MySQLはとにかくこのクエリを実行しますが、結果が明確になることを知っているかどうかに依存します。フィールドに複数の可能な値がある場合は、最初に取得した値を選択するだけです。

この場合、クエリが実際に何をすることになっているのか、そしてクエリから期待される結果が何であるのかを理解するのは困難です。

于 2012-10-31T00:11:01.667 に答える
1

あなたの助けに感謝します私はそれをすることになりましたそしてそれはローカルでPGに取り組んでいます!

Saving.select("DISTINCT ON (savings.product_id) * ").where{product_id.not_in(current_user_savings.select{product_id})}.group("savings.user_id, savings.updated_at, savings.id, savings.product_id, savings.price,savings.wishlist_id, savings.saved, savings.created_at")

その問題が発生したため、データベースをmysqlからdevに切り替えたので、herokuでこれ以上驚くことはありません!

于 2012-11-01T10:55:23.167 に答える
1

このコードの一部は、スコープまたは少なくともコントローラーに属していると思います。しかし、それは重要なことではありません。Gemfile を投稿できますか?

私の意見では、最善の方法は開発で同じデータベースと ORM を使用することです。PG をローカルで実行しようとしましたか?

ここでいくつかのことが起こっているようで、苦労しています。まず、開発マシンでローカルに PG を起動して実行し、それdatabases.ymlに合わせて更新します。

次に、MongoBD も使用していますか? ジェムを使用しなくなった場合は、バンドルから削除してください。

読みやすくするために Gemfile を少しクリーンアップしましたが、プロジェクトでの gem の役割をより適切に表すセクションに gem をグループ化することをお勧めします。多くの場合、Rails アプリは巨大な Gemfile で終了する傾向があります。これにより、他の誰かのプロジェクトをピックアップするのが非常に困難になります。

source 'https://rubygems.org'
ruby '1.9.3'

gem 'rails', '3.2.7'

gem 'compass_twitter_bootstrap', '2.0.3'
gem 'bcrypt-ruby', '3.0.1'
gem 'faker', '1.0.1'
gem 'will_paginate', '3.0.3'
gem 'bootstrap-will_paginate', '0.0.6'
gem 'omniauth-facebook', '1.4.0'
gem 'railroady'
gem 'devise', '2.1.2'
gem 'devise_invitable'
gem 'simple_form'
gem 'best_in_place'
gem "jquery-fileupload-rails"
gem 'paperclip'
gem "squeel"
gem 'client_side_validations'
gem 'wicked'
gem 'koala'
gem 'aws-sdk'

gem 'pg', '0.12.2'

gem 'jquery-rails'
gem 'jquery-ui-rails'

group :development, :test do
    gem 'annotate', '2.5.0'
    gem 'rspec-rails'
end

group :test do
    gem 'capybara'
    gem 'factory_girl_rails'
end

group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'compass-rails', '1.0.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

最後に、あなたの を調べて、application.rbActiveRecord が利用可能であることを確認してください。そうしなければならないように思えますが、見てくださいrequire "rails/all"

于 2012-10-30T19:35:40.750 に答える
0

SQL は PG では機能しません。MySQL ではそれが可能ですが、他の DBMS では機能しません。

このクエリ:

SELECT "savings".* FROM "savings"  
WHERE "savings"."product_id" 
NOT IN (SELECT "savings"."product_id" FROM "savings"  
         WHERE "savings"."user_id" = 1) 
GROUP BY "savings"."product_id"

する必要があります

SELECT "savings"."product_id", count(*) FROM "savings"  
--change this to your AGGR func
WHERE "savings"."product_id" 
NOT IN (SELECT "savings"."product_id" FROM "savings"  
         WHERE "savings"."user_id" = 1) 
GROUP BY "savings"."product_id"
于 2012-10-30T18:16:08.373 に答える