ActiveRecordのfindとArrayのfind

こんにちは!kossyです!




さて、今回はActiveRecordのfindとArrayのfindがどのようにして挙動を切り替えているか、
気になったので調べてみました。



ブロックの有無で分岐していた

# activerecord/lib/active_record/relation/finder_methods.rb

def find(*args)
  return super if block_given?
  find_with_ids(*args)
end

もしブロックが渡されていれば、Arrayクラスのfindを使い、そうでなければActiveRecordのfindを呼び出しているようです。

なので、

User.find(params[:id])

は、ブロックが渡されている訳ではないのでActiveRecordのfindメソッドが実行され、

User.all.find { |user| user.created_at == Date.today }

は、ブロック引数 {} が渡されているので、Arrayのfindメソッドが実行されるというわけですね。


コード規約を定める場合は、Arrayのfindメソッドのエイリアスである「detect」を使うようにする、
という取り決めをしてもいいかもしれませんね。



勉強になりました。