# File lib/active_record/associations.rb, line 342
      def has_many(association_id, options = {}, &extension)
        options.assert_valid_keys(
          :foreign_key, :class_name, :exclusively_dependent, :dependent, 
          :conditions, :order, :include, :finder_sql, :counter_sql, 
          :before_add, :after_add, :before_remove, :after_remove, :extend,
          :group
        )

        options[:extend] = create_extension_module(association_id, extension) if block_given?

        association_name, association_class_name, association_class_primary_key_name =
              associate_identification(association_id, options[:class_name], options[:foreign_key])
 
        require_association_class(association_class_name)

        raise ArgumentError, ':dependent and :exclusively_dependent are mutually exclusive options.  You may specify one or the other.' if options[:dependent] and options[:exclusively_dependent]

        if options[:exclusively_dependent]
          options[:dependent] = :delete_all
          #warn "The :exclusively_dependent option is deprecated.  Please use :dependent => :delete_all instead.")
        end

        # See HasManyAssociation#delete_records.  Dependent associations
        # delete children, otherwise foreign key is set to NULL.
        case options[:dependent]
          when :destroy, true  
            module_eval "before_destroy '#{association_name}.each { |o| o.destroy }'"
          when :delete_all
            module_eval "before_destroy { |record| #{association_class_name}.delete_all(%(#{association_class_primary_key_name} = \#{record.quoted_id})) }"
          when :nullify
            module_eval "before_destroy { |record| #{association_class_name}.update_all(%(#{association_class_primary_key_name} = NULL),  %(#{association_class_primary_key_name} = \#{record.quoted_id})) }"
          when nil, false
            # pass
          else
            raise ArgumentError, 'The :dependent option expects either true, :destroy, :delete_all, or :nullify' 
        end


        add_multiple_associated_save_callbacks(association_name)
        add_association_callbacks(association_name, options)

        collection_accessor_methods(association_name, association_class_name, association_class_primary_key_name, options, HasManyAssociation)
        
        # deprecated api
        deprecated_collection_count_method(association_name)
        deprecated_add_association_relation(association_name)
        deprecated_remove_association_relation(association_name)
        deprecated_has_collection_method(association_name)
        deprecated_find_in_collection_method(association_name)
        deprecated_find_all_in_collection_method(association_name)
        deprecated_collection_create_method(association_name)
        deprecated_collection_build_method(association_name)
      end