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
46 def def_association_instance_methods(opts)
47   super
48 
49   if opts[:adder]
50     add_method = opts[:add_method]
51     multi_add_method = opts[:multi_add_method] || :"add_#{opts[:name]}"
52     multi_add_method = nil if add_method == multi_add_method
53     if multi_add_method
54       association_module_def(multi_add_method, opts) do |objs, *args|
55         db.transaction(:server=>@server){objs.map{|obj| send(add_method, obj, *args)}.compact}
56       end
57     end
58   end
59 
60   if opts[:remover]
61     remove_method = opts[:remove_method]
62     multi_remove_method = opts[:multi_remove_method] || :"remove_#{opts[:name]}"
63     multi_remove_method = nil if remove_method == multi_remove_method
64     if multi_remove_method
65       association_module_def(multi_remove_method, opts) do |objs, *args|
66         db.transaction(:server=>@server){objs.map{|obj| send(remove_method, obj, *args)}.compact}
67       end
68     end
69   end
70 
71   if multi_add_method && multi_remove_method
72     association_module_def(:"#{opts[:name]}=", opts) do |objs, *args|
73       db.transaction(:server=>@server) do
74         existing_objs = send(opts.association_method)
75         send(multi_remove_method, (existing_objs - objs), *args)
76         send(multi_add_method, (objs - existing_objs), *args)
77         nil
78       end
79     end
80   end
81 end