2016-05-21 10 views
0

私のデータベースはPostgreSQLです。私はテーブルから重複行を排除するために、次のコードを使用しています:メソッドはArrayオブジェクトを返します

uniqBk = Bikehistory.all(
    :select => 'DISTINCT ON (bikehistories.bike_numbers) *', 
    :order => 'bikehistories.bike_numbers' 
) 

残念ながら返すオブジェクトは、Array代わりのActiveRecord::Relation::ActiveRecord_Relation_Bikehistoryのクラスです。

ActiveRecordオブジェクトを取得して同じクエリ結果を得るにはどうすればよいですか?

+0

あなたはbike_numbersによって注文された 'bikehistories.bike_numbers'または全体のレコードを選択する必要がありますか? –

+0

私はレコード全体が必要です – Przemek903

+0

なぜあなたは 'Bikehistory.order(:bike_numbers)'を使わないのですか? –

答えて

0

あなたはこのクエリを試すことができます。

Bikehistory.all.includes(:bikehistories).where('DISTINCT ON (bikehistories.bike_numbers) *').order('bikehistories.bike_numbers') 
+0

あなたの答えを使用するPG :: SyntaxError:エラー: "DISTINCT"またはその近くの構文エラー – Przemek903

+0

btw '.all'はここでは冗長です –

0

代わりに、このクエリを試してみましょう:

まあ
uniqBk = Bikehistory.where("JOIN (SELECT id, DISTINCT bike_numbers 
            FROM bikehistories 
           ) as temp 
          ON temp.id = id") 
        .order(:bike_numbers) 
0

、私のために私が埋め込まれたクエリを使用することを好むだろう、このような何か:

class Bikehistory 
    scope :unique, -> do 
     hists = self.arel_table 
     hists.where(hists[:id].in(self.distinct.pluck(:id).to_sql)).order(:bike_numbers) 
    end 
end 

しかし、もっと簡単な解決法があるかもしれません。レールも処理できます(試してみてください):

class Bikehistory 
    scope :unique, -> { where(id: self.distinct.pluck(:id)).order(:bike_numbers) } 
end 
関連する問題