2016-08-11 11 views
0

RubyのActiveRecord uniqメソッドで混乱します。私はそれを使用して、特定のフィールドだけでなく、完全なオブジェクトの配列を取得しようとしています。select vs distinct vs uniq?

新聞の名前とスコアをスコアオブジェクトとして保存する私のPadrinoアプリスクリプトでは、ActiveRecord関係の属性によるuniqメソッドは機能せず、どちらもSQL構文の有無にかかわらず区別されません。誰でも何が起こっているのか説明できますか?

class Score < ActiveRecord::Base 

    def self.from_today 
     self.where('created_at > ?', Date.today) 
    end 
end 


scores = Score.from_today 
scores.class  
=> Score::ActiveRecord_Relation 

scores.first 
=> #<Score id: 123, score: -2.55, source: "Mail", created_at: "2016-08-11 04:29:24", updated_at: "2016-08-11 04:29:24"> 

scores.map(&:source) 
=> ["Mail", "Guardian", "Telegraph", "Independent", "Express", "Mail"] 

scores.uniq(:source).count 
=> 6 

scores.distinct(:source).count 
=> 6 

scores.select('distinct (SOURCE)').count 
=> 5 #AHA, it works! 

scores.select(:source).distinct 
=> #<ActiveRecord::Relation [#<Score id: nil, source: "Telegraph">, #<Score id: nil, source: "Mail">, #<Score id: nil, source: "Independent">, #<Score id: nil, source: "Express">, #<Score id: nil, source: "Guardian">]> 

     #oops, no it doesn't 
+0

が制限されます。希望する結果セットは何ですか? –

+0

私はそれを使用して、特定のフィールドだけでなく、完全なオブジェクトの配列を取得しようとしています。 –

答えて

0

Rails 5にはパラメータがありません。 Rails 4.2では、パラメータはtrueまたはfalseのみです。 trueの場合は、falseが別個のレコードを返さない場合、異なるレコードを返します。 uniqは4

scores.select(:source).distinct.countはあなたが望むものである。この場合、Railsのためにそうdistinct

のための唯一の別名です。これにより、distinctからカラムsource

+0

しかし、完全なオブジェクトを返さないでしょうか? –

+0

'scores.select(:source).distinct'は完全なオブジェクトを返しません。ソース列が塗りつぶされたオブジェクトのみ。あなたが他の属性に必要な値を言うことができないからです。たとえば、 'source' Mailの値が' created_at'でなければならないオブジェクトは?レコード123の値または他の値は? – slowjack2k

+0

それで、unique:source属性を持つすべてのScoreオブジェクトを取り戻すにはどうすればいいですか? –

関連する問題