2014-02-16 36 views
2

我正在尝试编写一个非常简单的Rails迁移工具,该工具会向表中添加一个新列,并使用其他列中的数据组合填充该列。但是,该列会被添加,但每个记录的列值都是零。我究竟做错了什么?Rails迁移列已添加但尚未填充

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

调用permission.save将执行包括验证器在内的所有回调,也可能验证器正在阻止记录被保存。要跳过你可以使用update_column而不是保存

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

也验证我建议你一些提示:

  • 使用验证:: Permission.find_each而不是验证:: Permission.all.each (这会将所有记录在存储器中一次)
  • 尝试更新rake任务的权限,并且只使用迁移修改表(它是推荐的好习惯方式)
+1

这是一个EXC好的答案,比我的好。 – Sean

+0

谢谢肖恩,我很感激。 –

+0

将其更改为update_column也不起作用。我不得不写一个自定义SQL查询来做到这一点。仍然不确定为什么它没有通过。 – radhika

0

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

相关问题