【问题标题】: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