1

为客户处理 3.0 rails 项目,我有一个敏感的迁移,我需要在实时生产服务器上运行。它本质上假设将 DB、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
4

1 回答 1

2

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

无论将来发生什么变化,正确构建的迁移都将正确执行。无论它做什么,以后都可能取消,这没有什么错,但是为失败而设置它绝不是一个好主意。

您可以使用字符串函数在数据库中执行此降级操作,例如:

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

在迁移中使用模型会导致各种问题。这也适用于使用您的模型来预填充某些关键记录。如果seeds.rb您必须,甚至更好地rake为您完成一项任务,请使用它。

请注意,如果您无法在本地进行测试,那么您的开发过程就会非常有缺陷。您应该始终在适用的情况下运行和测试您的迁移,无论是向上还是向下,以确保它们正常工作。如果出于安全或隐私的原因您无法获得实际的生产数据,请与您的 DBA 合作以获取经过清理的非敏感版本以用于测试目的。例如,州名不应保密。

于 2012-08-22T17:46:50.260 回答