Rails迁移列已添加但未填充

时间:2014-02-16 00:39:06

标签: ruby-on-rails ruby rails-migrations

我正在尝试编写一个非常简单的Rails迁移,它向表中添加一个新列,并使用其他列的数据组合填充它。但是,添加了列,但每个记录的列值为nil。我做错了什么?

class AddNameToPermissions < ActiveRecord::Migration
  def change
    add_column :auth_permissions, :name, :string
    Auth::Permission.reset_column_information
    Auth::Permission.all.each do |permission|
      target_name = permission.target_symbol || permission.target_class
      permission.name = permission.action << ", " << target_name
      permission.save
    end
  end
end

2 个答案:

答案 0 :(得分:2)

调用permission.save将执行包括验证程序在内的所有回调,并且验证器可能会阻止保存记录。要跳过验证器,您可以使用update_column而不是save

permission.update_column(:name, permission.action << ", " << target_name)

我还会向您推荐几个提示:

  • 使用Auth :: Permission.find_each而不是Auth :: Permission.all.each(这会在内存中一次加载所有记录)
  • 尝试更新rake任务中的权限,并仅使用迁移来修改表格(这是推荐的良好做法)

答案 1 :(得分:0)

除非您在迁移中使用默认选项,否则通常建议您在自定义rake任务中执行此操作。内容迁移有点反模式。您想要的主要逻辑是任何必须处理数据库模式的东西。仅使用add_column行运行迁移,然后编写rake任务以将值从一个表传输到另一个表。