module LunaPark::Extensions::Dsl::ForeignKey::ClassMethods

Public Instance Methods

fk(fk_name, assoc_name, pk: :id) click to toggle source
# 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) click to toggle source
# 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