2011-07-29 7 views
0

私は、名前:文字列とその他の属性を持つアーティストモデルを持っています。しかし、私は同じ名前の下に複数のアーティストエントリを持っています。レール3:データベースクエリ

名前の重複がなくアーティストオブジェクトの配列をプルする方法はありますか?

私は、名前属性のみを使用する方法を見つけましたが、アーティストオブジェクト全体を取得することはできません。

これらは単なるname属性ん両方:

@artists = Artist.select('DISTINCT name').all 
@artists = Artist.all.collect{ |a| a.name }.uniq 

答えて

2

ActiveRecordのグループは、あなたが探しているものを行います(:名).ALL

+0

非常にうれしいありがとう、私はこれは、ベンチマークが上記の答えよりも50%優れているため、答えを与える。ありがとう。 –

0

マイレール3はあまりよくないですが、それはまだレール2の構文を持っています。

@artists = Artist.find(:all, :select => 'DISTINCT name') 

そして、私たちはいくつかのレール3愛を得ることができます。

+0

が古すぎるかもしれません:ArgumentError:Unknown key(s):distinct –

+0

ごめんなさい、構文が間違っています。修正しました。 – s84

+0

私は上記と同じだと思いますが、[#<アーティスト名: "jeff">、#<アーティスト名: "jim hendrix">]が返されます。 –

0

一つの方法は、個別の行のIDを取得し、そこからのデータの残りの部分をつかむためにある:Artist.group:

Artist.where('artists.id IN (SELECT MIN(a.id) FROM artists AS a GROUP BY a.name)').all 
+0

こんにちは、これは私が探していたものを完成させるように見えます。 –

+0

まず、すべてを名前でグループ化し(重複する名前はすべて1つのグループにあります)、それらのグループ(インナーセレクト)から最も低いIDを取得し、それらのIDを持つすべてのアーティストを取得します。それはまだ1つのSQLクエリですが、データベースは重複を避けるためにもう少し処理を行います。名前列には必ず索引を付けてください。重複しているアーティストが常に無視している場合は、最初に重複するアーティストを防ぐことを検討することをお勧めします。 –