模型代码更改后,使用数据更新运行迁移

时间:2017-05-24 10:36:54

标签: ruby-on-rails rails-migrations

我有一个名为Restream::Custom的模型和一个属性url。然后我想将url属性分成两部分:server_urlkey,并将两者都分开。 我为此写了这样的迁移:

def up
    add_column :restream_customs, :key, :string

    Restream::Custom.find_each do |r|
      last_slash = r.url.rindex("/")
      r.key = r.url[last_slash + 1 .. -1] #everything after last slash
      r.url = r.url[0 .. last_slash - 1] #everything before last slash
      r.save!
        end

    change_column :restream_customs, :key, :string, null: false
    rename_column :restream_customs, :url, :server_url
end

这在开发上运作良好。之后,我在restream/custom.rb中进行了大量更改,以便与server_url一起使用并验证它。 此次迁移因此在暂存时失败(并且在生产时失败),因为在运行r.save!时,它面临validates :server_url, presence: true并抛出unknown attribute 'server_url' for Restream::Custom

如何才能正确进行此更改?在一个回合中,如果可能的话。 (不要多次从回购中提取)。

1 个答案:

答案 0 :(得分:0)

在更新数据之前尝试将列url重命名为server_url

def up
  add_column :restream_customs, :key, :string
  rename_column :restream_customs, :url, :server_url

  Restream::Custom.find_each do |r|
    last_slash = r.server_url.rindex("/")
    r.key = r.server_url[last_slash + 1 .. -1] #everything after last slash
    r.server_url = r.server_url[0 .. last_slash - 1] #everything before last slash
    r.save!
  end

  change_column :restream_customs, :key, :string, null: false
end