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クラスのオブジェクトがたくさん詰まった配列になる。
で、
スクリプトコンソールで、以下のコマンドを実行すると・・・
と、返ってくる!!
idって、primary_keys をvalueとする配列だということがわかる!!
■ 結論
primary_keysを比較対象として比較した時に、重複をすべて取り除けるようなら“uniq”を使って重複は取り除ける
が、そうじゃなければ、何かまた考える必要がある(あるのかな?)。
ちなみに、
uniqメソッドは、配列を返すので、
humans.map{|human| human}.uniq
とかしなくても、
humans.uniq
とするだけでちゃんと配列ができ上がる。
なんでこんなことしたかったかと言えば、
PostgreSQLを対象として、distinctをしたかったんだけど、なかなかうまくいかなかった (・・`)
ポスグレのDISTINCTの仕様なのかな?
とにかく色々苦労に苦労を重ねて色々やったけど、どれもアヤシイ・・・
で、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でなんとかならんのか?って考えてみた