1

当我们尝试更新表中包含的某些数据时,我们遇到了迁移问题。

我们的基本模型如下所示:

用户

  • 用户名
  • 密码
  • …</li>

我们创建了第一个迁移以在模型中添加一列,然后更新现有行:

add_column :users, :deleted, :boolean

User.all.each do |user|
  user.deleted = false
  user.save
end

第二次迁移应该创建一个 last_name 列并将 username 列重命名为 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 中。

即使我们尝试绕过验证,问题仍然存在。

你有没有遇到过这种问题,你能帮我们绕过它吗,因为我们想坚持完整的 ruby​​ 代码而不编写任何 SQL?

4

2 回答 2

0

使用add_column :users, :deleted, :boolean, :default => false. 这应该用方法替换您的片段save

于 2012-04-28T14:48:48.253 回答
0

您可以在需要时强制 ActiveRecord 从迁移中的数据库重新加载模型信息:

User.reset_column_information

当您的模型与以前的数据库状态不够一致时,您还可以切换到原始 SQL 以使用以下execute方法执行更新:

execute 'UPDATE users SET deleted=0'
于 2012-04-28T14:50:19.580 回答