class Dumpable::Dumper

Attributes

dumpee[RW]
dumps[RW]
id_padding[RW]
options[RW]

Public Class Methods

dump(*records_and_collections) click to toggle source
# File lib/dumpable/dumper.rb, line 18
def self.dump(*records_and_collections)
  options = records_and_collections.extract_options!
  lines = []
  records_and_collections.each do |record_or_collection|
    if record_or_collection.is_a?(Array) || record_or_collection.is_a?(ActiveRecord::Relation) || (record_or_collection.is_a?(Class) && record_or_collection.ancestors.include?(ActiveRecord::Base))
      record_or_collection = record_or_collection.all if record_or_collection.is_a?(Class) && record_or_collection.ancestors.include?(ActiveRecord::Base)
      record_or_collection.each do |object|
        lines << new(object, options).dump
      end
    else
      lines << new(record_or_collection, options).dump
    end
  end
  Dumpable::FileWriter.write(lines.flatten.compact, options)
end
new(dumpee, options={}) click to toggle source
# File lib/dumpable/dumper.rb, line 5
def initialize(dumpee, options={})
  @dumpee = dumpee
  @options = Dumpable.config.merge(options || {})
  @id_padding = @options[:id_padding] || (@dumpee.class.respond_to?(:dumpable_options) && @dumpee.class.dumpable_options[:id_padding]) || Dumpable.config.id_padding
  @dumps = @options[:dumps] || (@dumpee.class.respond_to?(:dumpable_options) && @dumpee.class.dumpable_options[:dumps])
  @lines = []
end

Public Instance Methods

dump() click to toggle source
# File lib/dumpable/dumper.rb, line 13
def dump
  recursive_dump(@dumpee, @dumps)
  @lines << generate_insert_query(@dumpee)
end

Private Instance Methods

dump_value_string(value) click to toggle source

invisipunk.blogspot.com/2008/04/activerecord-raw-insertupdate.html

# File lib/dumpable/dumper.rb, line 80
def dump_value_string(value)
  case value.class.to_s
    when "Time", "ActiveSupport::TimeWithZone"
      "'#{value.strftime("%Y-%m-%d %H:%M:%S")}'"
    when "NilClass"
      "NULL"
    when "Fixnum"
      value
    when "String"
      "'#{value.gsub(/'/, "\\\\'")}'"
    when "FalseClass"
      '0'
    when "TrueClass"
      '1'
    when "ActiveSupport::HashWithIndifferentAccess"
      "'#{value.to_yaml.gsub(/'/, "\\\\'")}'"
    else
      "'#{value}'"
  end
end
generate_insert_query(object) click to toggle source

invisipunk.blogspot.com/2008/04/activerecord-raw-insertupdate.html

# File lib/dumpable/dumper.rb, line 65
def generate_insert_query(object)
  skip_columns = Array(@options[:skip_columns] || (object.class.respond_to?(:dumpable_options) && object.class.dumpable_options[:skip_columns])).map(&:to_s)
  cloned_attributes = object.attributes.clone
  return nil unless cloned_attributes["id"].present?
  cloned_attributes["id"] += @id_padding
  key_values = cloned_attributes.collect do |key,value|
    [key, dump_value_string(value)] unless skip_columns.include?(key.to_s)
  end.compact
  keys = key_values.collect{ |item| "`#{item[0]}`" }.join(", ")
  values = key_values.collect{ |item| item[1].to_s }.join(", ")

  "INSERT INTO #{object.class.table_name} (#{ keys }) VALUES (#{ values });"
end
recursive_dump(object, dumps) click to toggle source
# File lib/dumpable/dumper.rb, line 35
def recursive_dump(object, dumps)
  if dumps.nil?

  elsif dumps.is_a?(Array)
    dumps.each do |mini_dump|
      recursive_dump(object, mini_dump)
    end
  elsif dumps.is_a?(Hash)
    dumps.each do |key, value|
      recursive_dump(object, key)
      Array(object.send(key)).each { |child| recursive_dump(child, value) }
    end
  elsif dumps.is_a?(Symbol) || dumps.is_a?(String)
    Array(object.send(dumps)).each do |child_object|
      reflection = object.class.reflect_on_association(dumps.to_sym)
      if reflection.macro == :belongs_to
        object.send("#{reflection.association_foreign_key}=", object.id + @id_padding)
      elsif [:has_many, :has_one].include? reflection.macro
        if reflection.respond_to?(:foreign_key)
          child_object.send("#{reflection.foreign_key}=", object.id + @id_padding)
        else
          child_object.send("#{reflection.primary_key_name}=", object.id + @id_padding)
        end
      end
      @lines << generate_insert_query(child_object)
    end
  end
end