class ModelsToSql::Climber

Public Class Methods

climb(model, output, baton = {}) click to toggle source
# File lib/models_to_sql/climber.rb, line 4
def self.climb(model, output, baton = {})
  baton[:ignore_models] ||= []
  baton[:ignore_tables] ||= []
  baton[:dumped_ids] ||= Hash.new { |hsh,key| hsh[key] = Array.new }
  baton[:debug] ||= false
  baton[:level] ||= 0

  return if !model.class.respond_to?(:table_name)
  return if baton[:ignore_models].include?(model.class)
  return if baton[:ignore_tables].include?(model.class.table_name)
  return if baton[:dumped_ids][model.class].include?(model.id)
  
  baton[:dumped_ids][model.class] << model.id
  
  output << sql(model)
  STDERR << "LEVEL: #{baton[:level]} Copying #{model.class}:#{model.id}\n" if baton[:debug]

  model.class.reflect_on_all_associations.each do |assoc|
    assoc_value = model.send(assoc.name)
    if assoc_value
      unless assoc_value.is_a? Array
        leafs = [ assoc_value ]
      else
        leafs = assoc_value
      end

      leafs.each do |leaf|
        baton[:level] += 1
        climb(leaf, output, baton)
        baton[:level] -= 1
      end
    end
  end
end
sql(model) click to toggle source
# File lib/models_to_sql/climber.rb, line 39
def self.sql(model)
  
  include ActiveModel::AttributeMethods
  c = model.connection

  quoted_columns = []
  quoted_values = []

  if Rails.version.to_i >= 4
    attributes_with_values = model.send(:arel_attributes_with_values_for_create, model.attribute_names)
  else
    attributes_with_values = model.send(:arel_attributes_values, true, true)
  end

  attributes_with_values.each_pair do |key,value|
    quoted_columns << c.quote_column_name(key.name)
    quoted_values << c.quote(value)
  end

  "INSERT INTO #{model.class.quoted_table_name} (#{quoted_columns.join(', ')}) VALUES(#{quoted_values.join(', ')});\n"
end