2011-01-03 5 views
0

私はRails 3とpostgresqlを使用しています。私は以下のジャンルを持っています:ロック、雰囲気、オルタナティブ、ハウス。activerecordでアクティブなジャンルを取得するには?

また、2人のユーザーが登録されています。 1つはのロック、もう1つはハウスのジャンルです。私はロックや家のジャンルのオブジェクトを返す必要があります。

これを行うには2つの方法があります。一つは、グループを使用している:

Genre.group('genres.id, genres.name, genres.cached_slug, genres.created_at, genres.updated_at').joins(:user).all 

そして、他のDISTINCT使用:

Genre.select('DISTINCT(genres.name), genres.cached_slug').joins(:user) 

両方が同じ所望の結果を返します。しかし、どちらが優れたパフォーマンス賢明ですか?

ActiveRecord::StatementInvalid: PGError: ERROR: column "genres.id" must appear in the GROUP BY clause or be used in an aggregate function 
: SELECT genres.id FROM "genres" INNER JOIN "users" ON "users"."genre_id" = "genres"."id" GROUP BY genres.name 

答えて

1

DISTINCTGROUP BY通常、同じクエリプランを生成し、そのパフォーマンスは次のようになります。グループを()を使用すると、私はジャンルテーブル内のすべてのフィールドを示すために持っているので、そうでない場合は、私のようなエラーが出ます乱雑に見えます両方のクエリ構造全体で同じです。

Genre.select('DISTINCT(genres.name), genres.cached_slug').joins(:user) 

しようとしたときにこれがより明確になります:私はこの1つであると考えてい

あなたが任意の集約関数を使用していないので、あなたがあなたの状況に最も理にかなっているものを使用する必要があり、後であなたのコードを読んで、あなたがここで何をしたかを覚えておいて、あなたが指摘したように、はるかに面倒ではありません。

更新

それはあなたが使用しているのPostgreSQLバージョンに依存します。バージョン< 8.4を使用すると、GROUP BYの方が高速です。バージョン8.4以降では、それらは同じです。

+0

Genre.select( 'DISTINCT(genres.name)、genres。*')。joins(:user) –

関連する問題