当我们尝试更新表中包含的某些数据时,我们遇到了有关迁移的问题。
我们的基本模型如下所示:
用户
- 用户名
- 密码
- 。
我们创建了第一次迁移以在模型中添加列,然后更新现有行:
add_column :users, :deleted, :boolean
User.all.each do |user|
user.deleted = false
user.save
end
第二次迁移应该创建一个last_name列并将用户名列重命名为 first_name:
rename_column :users, :username, :first_name
add_column :users, :last_name, :string
它在开发中没有任何问题,因为第二次迁移是在第一次迁移几天后创建的(因此每个人都有足够的时间在第二次迁移之前应用第一个迁移(。
我们遇到的问题是,当我们尝试在暂存/生产中将这些迁移部署到以下模型时:
class User < ActiveRecord::Base
attr_accessible :first_name,
:last_name,
:password,
:password_confirmation,
...
...
end
第一次迁移在保存时失败,因为first_name和last_name尚不存在,尽管它们存在于attr_accessible中。
即使我们尝试绕过验证,问题仍然存在。
您是否曾经遇到过此类问题,您能否帮助我们绕过它,因为我们想在不编写任何 SQL 的情况下坚持使用完整的 ruby 代码?
您可以在需要时强制 ActiveRecord 从迁移中的数据库中重新加载模型信息:
User.reset_column_information
当您的模型与以前的数据库状态不够一致时,您还可以切换到原始 SQL 以使用 execute
方法执行更新:
execute 'UPDATE users SET deleted=0'
使用 add_column :users, :deleted, :boolean, :default => false
.这应该将您的片段替换为save
方法。