lib/rom/sql/plugin/associates.rb in rom-sql-1.0.0.beta2 vs lib/rom/sql/plugin/associates.rb in rom-sql-1.0.0.beta3
- old
+ new
@@ -10,13 +10,14 @@
klass.class_eval do
extend ClassMethods
include InstanceMethods
defines :associations
- associations []
+ associations Hash.new
option :associations, reader: true, optional: true, default: -> cmd { cmd.class.associations }
+ option :configured_associations, reader: true, optional: true, default: proc { [] }
end
super
end
module InstanceMethods
@@ -56,13 +57,23 @@
end
end
# @api public
def with_association(name, opts = EMPTY_HASH)
- self.class.build(relation, options.merge(associations: [[name, opts]]))
+ self.class.build(
+ relation, options.merge(associations: associations.merge(name => opts))
+ )
end
+ def associations_configured?
+ if configured_associations.empty?
+ false
+ else
+ configured_associations.all? { |name| associations.key?(name) }
+ end
+ end
+
# @api private
def __registry__
relation.__registry__
end
end
@@ -71,33 +82,45 @@
# @see ROM::Command::ClassInterface.build
#
# @api public
def build(relation, options = EMPTY_HASH)
command = super
+
+ if command.associations_configured?
+ return command
+ end
+
associations = command.associations
+ assoc_names = []
before_hooks = associations.each_with_object([]) do |(name, opts), acc|
relation.associations.try(name) do |assoc|
unless assoc.is_a?(Association::ManyToMany)
acc << { associate: { assoc: assoc, keys: assoc.join_keys(relation.__registry__) } }
else
true
end
end or acc << { associate: { assoc: name, keys: opts[:key] } }
+
+ assoc_names << name
end
after_hooks = associations.each_with_object([]) do |(name, opts), acc|
next unless relation.associations.key?(name)
assoc = relation.associations[name]
if assoc.is_a?(Association::ManyToMany)
acc << { associate: { assoc: assoc, keys: assoc.join_keys(relation.__registry__) } }
+ assoc_names << name
end
end
- command.before(*before_hooks).after(*after_hooks)
+ command.
+ with_opts(configured_associations: assoc_names).
+ before(*before_hooks).
+ after(*after_hooks)
end
# Set command to associate tuples with a parent tuple using provided keys
#
# @example
@@ -118,15 +141,15 @@
# @param [Hash] options The options
# @option options [Array] :key The association keys
#
# @api public
def associates(name, options = EMPTY_HASH)
- if associations.map(&:first).include?(name)
+ if associations.key?(name)
raise ArgumentError,
"#{name} association is already defined for #{self.class}"
end
- associations(associations.dup << [name, options])
+ associations(associations.merge(name => options))
end
end
end
end
end