結論:findは使わずにsingleを使うことにした。
社内のチーム向けに書いたのをブログに移す。ベンチ等はめんどくさいのでブログでは省く。
findは指定されたハッシュリファレンスの中からユニークキー・プライマリーキー以外を削ぎ落としてから検索してくれる。
ユニークキー・プライマリーキー以外を削ぎ落としたりする必要がある時は、find_or_create等の中くらいだと思っていて、それはなぜかというとcreateするために色々なキーを含めて一発で渡すからです。
# 内部でfindするときpkのid => 1しか使われない find_or_create({ id => 1, # pk hoge => 2, # insertするとき使用される fuga => 3, # insertするとき(ry });
自分で何かを検索したいと思って、findを書く場合は、pkまたはuniq keyを指定するはずなので、わざわざ削ぎ落とす処理は必要はない。
なので、検索は基本的には、下のような感じで書くようにする。
ほしいのが一個の時
- single使用
- prefetch等している場合は、search({...}, {rows => 1, prefetch => ["..."]})->next
- singleではエラーが出るため。firstは中でnextしてるけど、知らずに使ってハマる場合があるので明確にnextにするべし
ほしいのがたくさん
- search({})->all;
- whileでの search({})->next