def has(cardinality, name, *args)
name = name.to_sym
model = extract_model(args)
options = extract_options(args)
min, max = extract_min_max(cardinality)
options.update(:min => min, :max => max)
assert_valid_options(options)
if options.key?(:model) && model
raise ArgumentError, 'should not specify options[:model] if passing the model in the third argument'
end
model ||= options.delete(:model)
repository_name = repository.name
options[:child_repository_name] = options.delete(:repository)
options[:parent_repository_name] = repository_name
klass = if max > 1
options.key?(:through) ? Associations::ManyToMany::Relationship : Associations::OneToMany::Relationship
else
Associations::OneToOne::Relationship
end
relationship = klass.new(name, model, self, options)
relationships(repository_name) << relationship
descendants.each do |descendant|
descendant.relationships(repository_name) << relationship
end
create_relationship_reader(relationship)
create_relationship_writer(relationship)
relationship
end