1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
# frozen-string-literal: true
module Sequel
module Plugins
# The delay_add_association plugin delays the adding of
# associated objects to a new (unsaved) object until after the new
# object is saved. By default, if you attempt to add
# associated objects to a new object, Sequel will raise
# an error, because you need to have a primary key before
# saving the objects.
#
# When delaying the add of an associated object, the object
# will be immediately added to the cached association array.
# When saving the current object, it will also attempt to
# validate any associated objects, and if the associated objects
# are not valid, the current object will also be considered
# not valid.
#
# Usage:
#
# # Make all model subclass delay add_association for new objects
# Sequel::Model.plugin :delay_add_association
#
# # Make the Album class delay add_association for new objects
# Album.plugin :delay_add_association
module DelayAddAssociation
# Depend on the validate_associated plugin.
def self.apply(mod)
mod.plugin :validate_associated
end
module InstanceMethods
private
# Delay the addition of the associated object till after
# saving the current object, if the current object is new
# and the associated dataset requires a primary key on the
# current object.
def add_associated_object(opts, o, *args)
if opts.dataset_need_primary_key? && new?
o = make_add_associated_object(opts, o)
delay_validate_associated_object(opts, o)
public_send(opts[:name]) << o
after_create_hook{super(opts, o, *args)}
o
else
super
end
end
end
end
end
end
|