module Sequel::Plugins::AssociationMultiAddRemove::ClassMethods

Private Instance Methods

def_association_instance_methods(opts) click to toggle source

Define the methods use to add/remove/set multiple associated objects in a single method call.

Calls superclass method
# File lib/sequel/plugins/association_multi_add_remove.rb, line 45
def def_association_instance_methods(opts)
  super

  if opts[:adder]
    add_method = opts[:add_method]
    multi_add_method = opts[:multi_add_method] || :"add_#{opts[:name]}"
    multi_add_method = nil if add_method == multi_add_method
    if multi_add_method
      association_module_def(multi_add_method, opts) do |objs, *args|
        db.transaction(:server=>@server){objs.map{|obj| send(add_method, obj, *args)}.compact}
      end
    end
  end

  if opts[:remover]
    remove_method = opts[:remove_method]
    multi_remove_method = opts[:multi_remove_method] || :"remove_#{opts[:name]}"
    multi_remove_method = nil if remove_method == multi_remove_method
    if multi_remove_method
      association_module_def(multi_remove_method, opts) do |objs, *args|
        db.transaction(:server=>@server){objs.map{|obj| send(remove_method, obj, *args)}.compact}
      end
    end
  end

  if multi_add_method && multi_remove_method
    association_module_def(:"#{opts[:name]}=", opts) do |objs, *args|
      db.transaction(:server=>@server) do
        existing_objs = send(opts.association_method)
        send(multi_remove_method, (existing_objs - objs), *args)
        send(multi_add_method, (objs - existing_objs), *args)
        nil
      end
    end
  end
end