Module: Poly::Owners

Extended by:
ActiveSupport::Concern
Defined in:
lib/poly/owners.rb

Class Method Summary collapse

Class Method Details

.apply_owner(record, owner, type_column, id_column, allow_nil: true) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/poly/owners.rb', line 34

def self.apply_owner(record, owner, type_column, id_column, allow_nil: true)
  resolved = resolve_owner(record, owner)
  if resolved.nil?
    assign_nil_owner(record, type_column, id_column, allow_nil: allow_nil)
  elsif resolved.is_a?(ActiveRecord::Base)
    raise ArgumentError, 'owner must be persisted' unless resolved.persisted?

    record.public_send(:"#{type_column}=", resolved.class.base_class.name)
    record.public_send(:"#{id_column}=", resolved.id)
  else
    raise ArgumentError, "owner must resolve to an ActiveRecord::Base, got #{resolved.class}"
  end
end

.assign_nil_owner(record, type_column, id_column, allow_nil:) ⇒ Object

Raises:

  • (ArgumentError)


48
49
50
51
52
53
# File 'lib/poly/owners.rb', line 48

def self.assign_nil_owner(record, type_column, id_column, allow_nil:)
  raise ArgumentError, 'owner resolved to nil' unless allow_nil

  record.public_send(:"#{type_column}=", nil)
  record.public_send(:"#{id_column}=", nil)
end

.resolve_owner(record, owner) ⇒ Object



55
56
57
58
59
60
61
62
63
64
# File 'lib/poly/owners.rb', line 55

def self.resolve_owner(record, owner)
  case owner
  when Proc
    record.instance_exec(&owner)
  when Symbol, String
    record.public_send(owner)
  else
    owner
  end
end