为客户端开发一个3.0 rails项目,我有一个敏感的迁移,我需要在现场生产服务器上运行。它基本上假设DB中的所有State缩写,FL - > fl,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
答案 0 :(得分:2)
迁移的一个非常重要的规则是永远不要在迁移中引用模型。这似乎是一个学术问题,但在将来的某个时候,您可能根本没有State
模型,当您删除app/models/state.rb
时,此迁移将无效。
无论将来发生什么变化,正确构建的迁移都将正确执行。无论它做什么可能以后都没有做到,这没有什么不妥,但是为失败做好准备永远不是一个好主意。
您可以使用字符串函数在数据库中执行此缩减操作,例如:
execute "UPDATE states SET abbreviation=LOWER(abbreviation)"
在迁移中使用模型会导致各种问题。这也适用于使用模型预先填充某些关键记录。如果您必须(或更好)执行seeds.rb
任务,请使用rake
。
请注意,如果您无法在本地进行测试,那么您的开发过程就会非常糟糕。您应始终在适用的情况下上下运行和测试迁移,以确保它们正常运行。如果出于安全或隐私的原因无法获得实际的生产数据,请与您的DBA合作,以获得用于测试目的的经过擦洗的非敏感版本。例如,州名不应该是保密的。