module FlattenRecord::Flattener::ClassMethods

Public Instance Methods

create_with(normal) click to toggle source
# File lib/flatten_record/flattener.rb, line 39
def create_with(normal)
  if normal_model.eql?(normal.class)
    destroy_with(normal)
    records = flattener_meta.denormalize(normal.reload, self.new)
    records.respond_to?(:each) ? records.each(&:save) : records.save
    records
  else
    destroy_with(normal)
    find_normals(normal).each do |n|
      create_with(n)
    end
  end
end
Also aliased as: update_with
denormalize(normal_model, definition_hash) click to toggle source
# File lib/flatten_record/flattener.rb, line 20
def denormalize(normal_model, definition_hash)
  self.class_variable_set("@@definition_hash", definition_hash)
  self.class_variable_set("@@normal_model", normal_model.to_s.camelize.constantize)
end
destroy_with(normal) click to toggle source
# File lib/flatten_record/flattener.rb, line 54
def destroy_with(normal)
  if normal_model.eql?(normal.class)
    records = find_with(normal)
    records.each(&:destroy)
  else
    # update associated model
    find_normals(normal).each do |n|
      update_with(n)
    end
  end
  records
end
destroy_with_id(normal_id, normal_class=normal_model) click to toggle source
# File lib/flatten_record/flattener.rb, line 67
def destroy_with_id(normal_id, normal_class=normal_model)
  if normal_model.eql?(normal_class)
    records = find_with_id(normal_id, normal_class)
    records.each(&:destroy)
  else
    # update associated model
    find_normals_with_id(normal_id, normal_class).each do |n|
      update_with(n)
    end
  end
  records
end
find_node(type, value) click to toggle source
# File lib/flatten_record/flattener.rb, line 122
def find_node(type, value)
  flattener_meta.traverse_by(type, value)
end
find_normals(normal) click to toggle source
# File lib/flatten_record/flattener.rb, line 80
def find_normals(normal)
  return normal if normal_model.eql?(normal.class)
  
  records = find_with(normal)
  id_name = flattener_meta.id_column.name
  normal_id_name = flattener_meta.id_column.column.name
  
  ids = records.collect{|c| c.send(id_name.to_sym) }
  normal_model.where(normal_id_name => ids)
end
find_normals_with_id(normal_id, normal_class=normal_model) click to toggle source
# File lib/flatten_record/flattener.rb, line 91
def find_normals_with_id(normal_id, normal_class=normal_model)
  return normal_class.find(normal_id) if normal_model.eql?(normal_class)
  
  records = find_with_id(normal_id, normal_class)
  id_name = flattener_meta.id_column.name
  normal_id_name = flattener_meta.id_column.column.name
  
  ids = records.collect{|c| c.send(id_name.to_sym) }
  normal_model.where(normal_id_name => ids)
end
find_with(normal) click to toggle source
# File lib/flatten_record/flattener.rb, line 102
def find_with(normal)
  node = find_node(:target_model, normal.class)
  
  raise "#{normal.class} was not defined in the denormalization" if node.nil?
  id_name = node.id_column.name 
  normal_id_name = node.id_column.column.name

  self.where(id_name => normal.send(normal_id_name))
end
find_with_id(normal_id, normal_class=normal_model) click to toggle source
# File lib/flatten_record/flattener.rb, line 112
def find_with_id(normal_id, normal_class=normal_model)
  node = find_node(:target_model, normal_class)
  
  raise "#{normal_class} was not defined in the denormalization" if node.nil?
  id_name = node.id_column.name 
  normal_id_name = node.id_column.column.name

  self.where(id_name => normal_id)
end
flattener_meta() click to toggle source
# File lib/flatten_record/flattener.rb, line 25
def flattener_meta
 
  node = self.class_variable_get(:@@root_node)
  if node.blank?
    definition = Definition.new(self.definition_hash)

    root_node = Meta::RootNode.new(self.normal_model, self)
    root_node.build(definition)
 
    node = self.class_variable_set("@@root_node", root_node)
  end
  node
end
update_with(normal)
Alias for: create_with