ActiveRecord::Base.find
よくお世話になっているくせにRailsのfindメソッドのコードを初めて読んだので、メモ。
activerecord-2.3.2/lib/active_record/base.rb
def find(*args) options = args.extract_options! validates_find_options(options) set_readonly_options!(options) case args.first when :first then find_initial(options) when :last then find_last(options) when :all then find_every(options) else find_form_ids(args, options) end end
ちなみに、find_initialメソッドとfind_everyメソッドはこんな感じ。
結局はfind_everyメソッドに集約されてる。
eager_loadingの仕組みが垣間見えて面白い。
activerecord-2.3.2/lib/active_record/base.rb
def find_initial(options) options.update(:limit => 1) find_every(options).first end def find_every(options) include_associations = merge_includes(scope(:find, :include), options[:include]) if include_associations.any? && references_eager_loaded_tables?(options) records = find_with_associations(options) else records = find_by_sql(construct_finder_sql(options)) if include_associations.any? preload_associations(records, include_associations) end end records.each { |record| record.readonly! } if options[:readonly] records end