5 def self.included(base)
6 # Rails' "has_many" can prevent us from destroying the owner
7 # record when other objects refer to it.
8 ActiveRecord::Base.connection.tables.each do |t|
9 next if t == base.table_name
10 next if t == 'schema_migrations'
11 klass = t.classify.constantize
12 next unless klass and 'owner_uuid'.in?(klass.columns.collect(&:name))
13 base.has_many(t.to_sym,
14 foreign_key: :owner_uuid,
18 # We need custom protection for changing an owner's primary
19 # key. (Apart from this restriction, admins are allowed to change
21 base.validate :restrict_uuid_change_breaking_associations
26 def restrict_uuid_change_breaking_associations
27 return true if new_record? or not uuid_changed?
29 # Check for objects that have my old uuid listed as their owner.
30 self.class.reflect_on_all_associations(:has_many).each do |assoc|
31 next unless assoc.foreign_key == :owner_uuid
32 if assoc.klass.where(owner_uuid: uuid_was).any?
34 "cannot be changed on a #{self.class} that owns objects")
39 # if I owned myself before, I'll just continue to own myself with
41 if owner_uuid == uuid_was
42 self.owner_uuid = uuid