【问题标题】:Migrating a Rails ActiveRecord column to a new model将 Rails ActiveRecord 列迁移到新模型
【发布时间】:2012-05-26 20:12:29
【问题描述】:

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

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

我是 Rails 新手,正在寻找进行此类迁移的规范方法。使用 Rails 2.3

【问题讨论】:

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


    【解决方案1】:

    您将遇到一些命名空间问题,因为您的新域关联需要进行一些重命名。 迁移也可以运行 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多