【Rails3.2】uniqメソッドを使った際に、ActiveRecord::StatementInvalidが発生してしまう場合
Rails3.2から導入されたActiveRecord::Relation#uniq はとっても便利で、
records.select(:name).uniq
と書くだけで、ユニークなnameの一覧が取得できます!
(recordsは何かしらレコードの集合です。)
でも
records = Client.order(:address) : records.select(:name).uniq
と書くと、
ActiveRecord::StatementInvalid: PG::Error: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
というようなエラーを吐いてしまいます。
これは、selectしていないカラムに含まれていないカラム(この例ではaddress)でorderしようとしたために発生しています。
この例ではorderを消せば良い話ですが、
他のメソッドからorder済みの値が渡ってくる場合は困ってしまいます。(´・ω・`)
そんな際は、reorder()メソッドを使えば良いです。
records = Client.order(:address) : records.reorder(:name) #それまでのorderをなかったことにして、orderしなおす records.select(:name).uniq
以上により、selectに含まれないカラムに対するorderを消すことが出来、無事動くようになりました。