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