Module: LunaPark::Extensions::Dsl::ForeignKey::ClassMethods

Defined in:
lib/luna_park/extensions/dsl/foreign_key.rb

Instance Method Summary collapse

Instance Method Details

#fk(fk_name, assoc_name, pk: :id) ⇒ Object



53
54
55
# File 'lib/luna_park/extensions/dsl/foreign_key.rb', line 53

def fk(fk_name, assoc_name, pk: :id)
  foreign_key(fk_name, assoc_name, primary_key: pk)
end

#foreign_key(fk_name, assoc_name, primary_key: :id) ⇒ Object

rubocop:disable Metrics/MethodLength, Metrics/AbcSize



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/luna_park/extensions/dsl/foreign_key.rb', line 57

def foreign_key(fk_name, assoc_name, primary_key: :id) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  pk_name = primary_key
  serializable_attributes(fk_name) if include?(Serializable)
  comparable_attributes(fk_name)   if include?(Comparable)

  attr_reader fk_name, assoc_name

  anonym_mixin = Module.new do
    define_method(:"#{assoc_name}=") do |new_assoc|
      new_assoc_pk = extract_pk_value_from_object__(new_assoc, pk_name)
      instance_variable_set(:"@#{fk_name}", new_assoc_pk)
      instance_variable_set(:"@#{assoc_name}", new_assoc)
    end

    define_method(:"#{fk_name}=") do |new_fk|
      assoc = public_send(assoc_name)
      instance_variable_set(:"@#{fk_name}", new_fk)
      return new_fk if assoc.nil?

      current_assoc_pk = extract_pk_value_from_object__(assoc, pk_name)
      instance_variable_set(:"@#{assoc_name}", nil) unless new_fk == current_assoc_pk
      new_fk
    end
  end
  include anonym_mixin
end