パルカワ2

最近はFlutterをやっています

DBICのfindについて考えた。

結論: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