ActiveRecordのfindした結果に対して、uniqメソッドを使って重複を取り除くのは正しいのか?

という疑問。
というか、命題??

結論を先に言うと、

正しいこともある



1.findした結果は、findメソッドを発行したModelのオブジェクトが詰まった配列が返ってくる。
2.uniqは、Arrayクラスのメソッドである
3.uniqは、eql?メソッドで比較して同一かどうかを判断する

[findした結果].uniq

って、やった場合、[findした結果]配列の一つ一つを比べるわけになる。
Modelのオブジェクトを取り出して比べるって、何で比べるのさ??

■ ActiveRecordクラスのeqlメソッドについて
APIを見ると、
eql?メソッドは、==メソッドと同じみたいだ。

==メソッドのリファレンスでは、

Returns true if the comparison_object is the same object, or is of the same type and has the same id.

とある。
同じオブジェクトである or 同じ型である、かつ同じidである時にtrueを返す。

idってナンスカ (・・`)?


■ Modelのオブジェクトのidって?

HumanっていうModelがある

これに対して、humans = Human.find(:all) ってやると、
humansは、Humanクラスのオブジェクトがたくさん詰まった配列になる。

で、

スクリプトコンソールで、以下のコマンドを実行すると・・・

>> humans[0].id
humans[0].id
=> ["primary_keysAの値", "primary_keysBの値", "primary_keysCの値"


と、返ってくる!!

idって、primary_keys をvalueとする配列だということがわかる!!


■ 結論
primary_keysを比較対象として比較した時に、重複をすべて取り除けるようなら“uniq”を使って重複は取り除ける


が、そうじゃなければ、何かまた考える必要がある(あるのかな?)。


ちなみに、
uniqメソッドは、配列を返すので、

humans.map{|human| human}.uniq

とかしなくても、

humans.uniq

とするだけでちゃんと配列ができ上がる。


なんでこんなことしたかったかと言えば、
PostgreSQLを対象として、distinctをしたかったんだけど、なかなかうまくいかなかった (・・`)

ポスグレのDISTINCTの仕様なのかな?
とにかく色々苦労に苦労を重ねて色々やったけど、どれもアヤシイ・・・

で、uniqでなんとかならんのか?って考えてみた