class ImportDatabase attr_accessor :src_prefix attr_accessor :map attr_accessor :tables def logger RAILS_DEFAULT_LOGGER end def mapped_from(table, value) logger.warn "NOT FOUND #{table}, #{value}, #{value.class}" unless @map[table][value] @map[table][value] end def import_table(table, options = {}) logger.info "Import: #{table}" table_options = (@tables[table] || {}).merge(options[:table] || {}) model = table_options[:model] model.destroy_all if (options[:destroy_all]) sql ="SELECT * FROM #{@src_prefix}#{table_options[:src]}" sql << " WHERE #{table_options[:conditions]}" if table_options[:conditions] ActiveRecord::Base.connection.select_all(sql).each do |src_record| begin table_options[:before_row_import].call(src_record) if table_options[:before_row_import] dest_record = model.new table_options[:attributes].each do |key, value| dest_value = case value when Symbol src_record[value.to_s] when Proc value.call(src_record) else value end dest_record.send("#{key}=", dest_value) end dest_record.save! logger.info "Imported from #{table} #{src_record["id"]} to #{dest_record.id}" (@map[table] ||= {})[src_record["id"]] = dest_record.id rescue logger.warn "Not imported: #{table_options[:src]}:#{src_record["id"]} because #{$!}" end end end end