# File lib/active_ldap/associations.rb, line 113
      def has_many(association_id, options = {})
        validate_has_many_options(options)
        klass = options[:class]
        klass ||= (options[:class_name] || association_id.to_s).classify
        foreign_key = options[:foreign_key]
        primary_key = options[:primary_key]
        set_associated_class(association_id, klass)

        opts = {
          :association_id => association_id,
          :foreign_key_name => foreign_key,
          :primary_key_name => primary_key,
          :wrap => options[:wrap],
          :extend => options[:extend],
        }
        if opts[:wrap]
          opts[:foreign_key_name] ||= "#{association_id}_id"
          association_class = Association::HasManyWrap
        else
          association_class = Association::HasMany
          primary_key_name = opts[:primary_key_name]
          foreign_key_name = opts[:foreign_key_name]
          if primary_key_name != foreign_key_name and
              !new.have_attribute?(primary_key_name)
            message = _(":primary_key and :foreign_key has_many options are " \
                        "inverted their mean since 1.1.0. Please invert them.")
            ActiveSupport::Deprecation.warn(message)
            opts[:foreign_key_name] = primary_key_name
            opts[:primary_key_name] = foreign_key_name
          end
        end

        association_accessor(association_id) do |target|
          association_class.new(target, opts)
        end
      end