紳士なブログ

紳士すぎてすみません

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