Ruby on Rails: Миграции: как объединить таблицы в новую таблицу? - PullRequest
2 голосов
/ 20 июля 2010

у меня есть две таблицы приложения:

name, doc_name, doc_type, doc_size, cat

и носители:

name, doc_name, doc_type, doc_size, cat

как мне написать файл миграции так, чтобы он взял все записи из обеих таблиц и поместил их в новую таблицу Files?

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Я бы сделал это в первую очередь с помощью SQL.Делая некоторые предположения о ваших типах данных:

class CreateFiles < ActiveRecord::Migration

 def self.up
  create_table :files do |t|
   t.string :name
   t.string :doc_name
   t.string :doc_type
   t.integer :doc_size
   t.string :cat
  end

  execute ("insert into files select * from attachments");
  execute ("insert into files select * from media");
 end

 def self.down
  drop_table :files
 end

end
2 голосов
/ 20 июля 2010
class MergeAttachmentsMediaToFiles < ActiveRecord::Migration
  def self.up
    create_table :files do |t|
      t.column :name, :string
      # ...
    end

    Attachment.find(:all).each do |attachment|
      File.create(:name => attachment.name,
                  :doc_name => attachment.doc_name,
                  :doc_type => attachment.doc_type,
                  :doc_size => attachment.doc_size,
                  :cat => attachment.cat)
    end

    # do similar for Media
  end


end
1 голос
/ 20 июля 2010

Я знаю SQL для этого.

    def self.up
          create_table :files do |t|
            t.string  :name
            t.string  :doc_name
            t.string  :doc_type
            t.string  :doc_size
            t.string :cat
          end

          execute "INSERT INTO create_table(name, doc_name, doc_type, doc_size, cat)
                   SELECT name, doc_name, doc_type, doc_size, cat FROM attachments
                   UNION
                   SELECT name, doc_name, doc_type, doc_size, cat FROM media"

          drop_table :attachments
          drop_table :media
end

Не проверено, но должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...