Попробуйте:
Получить пересечение столбцов между TableA и TableB
columns = (TableA.column_names & TableB.column_names) - ["id"]
Теперь переберите строки TableA и создайте строки TableB.
TableB.create( TableA.all(:select => columns.join(",") ).map(&:attributes) )
Редактировать: Копирование одной записи:
table_a_record = TableA.first(:select => columns.join(","), :conditions => [...])
TableB.create( table_a_record.attributes)