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