2012-08-22 135 views
1

为客户端工作在3.0 rails项目上,并且我需要运行一个实时生产服务器的敏感迁移。它基本上是假设在数据库,FL - > fl,PA - > pa等所有州缩写... 由于限制我不能在本地测试: 确实调用迁移效果的措辞什么?我知道它与添加和创建等,但不知道更新这样的信息时。移植评论

rails g migration UpdateStateAbbreviation 

def self.up  
    say_with_time "Updating states abbreviation..." do 
    State.find(:all).each do |s| 
    tmp = s.abbreviation.downcase 
    s.update_attribute :abbreviation, tmp 
    end 
end end 

Rake db:migrate 

回答

2

迁移的一个非常重要的规则是永远不要在您的迁移中引用模型。这可能看起来像是一个学术问题,但在将来的某个时候,根本没有State模型,并且在删除app/models/state.rb时,此迁移将不起作用。

无论将来发生什么变化,正确构建的迁移都将正确执行。无论它做什么都可能后来没有完成,这没有什么不妥,但是设置失败并不是一个好主意。

execute "UPDATE states SET abbreviation=LOWER(abbreviation)" 

使用模型迁移导致各种问题:

您可以在数据库中使用字符串函数类的东西做这个downcasing操作。这也适用于使用您的模型预先填充某些关键记录。如果您必须(或甚至更好)使用seeds.rb任务来为您完成此任务,请使用seeds.rb

需要注意的是,如果您无法在本地进行测试,那么您的开发流程非常瑕疵。您应始终在适用的情况下运行并测试您的迁移,以确保其正常工作。如果您出于安全或隐私的原因无法获得实际的生产数据,请与您的DBA合作,为测试目的获取经过清理的非敏感版本。例如,州名不应该是机密的。