class Embedson::Model::EmbeddedBuilder

Attributes

builder[R]
klass[R]

Public Class Methods

new(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 6
def initialize(builder)
  @builder = builder
  @klass = builder.klass
end

Public Instance Methods

define() click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 11
def define
  methods_embedded.each do |meth|
    klass.class_exec builder, &self.method(meth)
  end
end

Private Instance Methods

embedded_alter_initialize(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 23
def embedded_alter_initialize(builder)
  klass.send :alias_method, "#{builder.field_name}_initialize".to_sym, :initialize
  klass.send :private, "#{builder.field_name}_initialize"
end
embedded_any_present?(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 113
def embedded_any_present?(builder)
  return if klass.methods.include? :any_ebedding_present?
  klass.send :define_method, :any_embedding_present? do
    self.class.embedson_relations.any?{ |r| public_send(r).present? }
  end

  klass.send :private, :any_embedding_present?
end
embedded_call_in_transaction_for_all_embedding(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 96
def embedded_call_in_transaction_for_all_embedding(builder)
  return if klass.methods.include? :call_in_transaction_for_all_embedding
  klass.send :define_method, :call_in_transaction_for_all_embedding do |method, object|
    results = []
    ActiveRecord::Base.transaction do
      self.class.embedson_relations.each do |field_name|
        next if public_send(field_name).nil?
        send("#{field_name}_send_to_related", object)
        save_res = public_send(field_name).send(method)
        results << save_res
        raise ActiveRecord::Rollback unless save_res
      end
    end
    !results.size.zero? && results.all?
  end
end
embedded_changed(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 73
def embedded_changed(builder)
  klass.send :define_method, 'embedson_model_changed!' do
    raise NoParentError.new('register change', self.class.name) unless any_embedding_present?

    self.class.embedson_relations.each do |relation|
      send("#{relation}_send_to_related", self) if public_send(relation).present?
    end
    true
  end
end
embedded_destroy(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 54
def embedded_destroy(builder)
  klass.send :define_method, 'destroy' do
    call_in_transaction_for_all_embedding('save!', nil)
  end
end
embedded_initializer(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 28
def embedded_initializer(builder)
  klass.send :define_method, "initialize" do |*args|
    attrs = args[0] || {}
    val = attrs.delete(builder.field_name)

    send("#{builder.field_name}_initialize", *args)
    public_send("#{builder.field_name}=", val) if val.present?
  end
end
embedded_reader(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 48
def embedded_reader(builder)
  klass.send :define_method, builder.field_name do
    instance_variable_get(builder.instance_var_name)
  end
end
embedded_save(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 60
def embedded_save(builder)
  klass.send :define_method, 'save' do
    call_in_transaction_for_all_embedding('save', self)
  end
end
embedded_save!(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 66
def embedded_save!(builder)
  klass.send :define_method, 'save!' do
    raise NoParentError.new('save!', self.class.name) unless any_embedding_present?
    call_in_transaction_for_all_embedding('save!', self)
  end
end
embedded_writer(builder) click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 38
def embedded_writer(builder)
  klass.send :define_method, "#{builder.field_name}=" do |arg|
    send("#{builder.field_name}_verify_arg_klass", arg)

    instance_variable_set(builder.instance_var_name, arg)

    send("#{builder.field_name}_send_to_related", self)
  end
end
methods_embedded() click to toggle source
# File lib/embedson/model/embedded_builder.rb, line 19
def methods_embedded
  self.class.private_instance_methods(false).select{ |m| m.to_s.start_with?('embedded_') }
end