将Rails ActiveRecord列迁移到新模型

时间:2012-05-26 20:12:29

标签: ruby-on-rails activerecord rails-migrations

我有一个名为Domain_Data的表,它有一个名为domain的唯一字符串列。因为很多东西需要在我的应用程序中指向域,所以我将把Domain分离到它自己的单独模型。在Domain_Data中,我想用domain的外键指针替换Domain.id列。棘手的部分是更新数据本身,以便域字符串位于Domainid指针位于Domain_Data

我很清楚如何在纯SQL中进行这样的迁移,但是我想知道“Railsy”是如何进行这样的迁移的。这一切都可以通过迁移完成,还是应该通过rake任务等手动完成?

我是一个Rails newb,正在寻找像这样进行迁移的规范方法。使用Rails 2.3

1 个答案:

答案 0 :(得分:0)

您将遇到一些命名空间问题,因为您的新域关联需要进行一些重命名。 迁移也可以运行ruby代码,因此您的迁移可能看起来像这样

以下是所需的常规代码。

 # First Migration to rename the domain field
    def RenameDomainField < ActiveRecord::Migration
      def self.up
        rename_column :domain_datas, :domain, :domain_name
      end

      def self.down
        #code for opposite of up
      end

    end


    # Second Migration to add the Domain model
    def CreateDomains < ActiveRecord::Migration
      def self.up
        create_table :domain do |t|
          t.string :domain_name
        end
      end

      def self.down
        #code for opposite of up
      end

    end

    #Create a new relationship:
    def DomainData < ActiveRecord::Base
      belongs_to :domain
    end


    # A third migration to move the data over
    def RefactorDomainData < ActiveRecord::Migration
      def self.up
        #Add the new forgein key
        add_column :domain_datas, :domain_id, :integer

        #create the new domain records and link them
        DomainData.all do |domain_data|
          domain_data.create_domain(:domain_name => domain_data.domain_name)
        end

        #trash the old column
        remove_column :domain_datas, :domain_name
      end

      def self.down
        #code for opposite of up
      end

    end