移民批评

时间:2012-08-22 17:04:30

标签: ruby-on-rails rails-migrations

为客户端开发一个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

1 个答案:

答案 0 :(得分:2)

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

无论将来发生什么变化,正确构建的迁移都将正确执行。无论它做什么可能以后都没有做到,这没有什么不妥,但是为失败做好准备永远不是一个好主意。

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

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

在迁移中使用模型会导致各种问题。这也适用于使用模型预先填充某些关键记录。如果您必须(或更好)执行seeds.rb任务,请使用rake

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

相关问题