Ruby on rails Rails:当我们使用attr\u accessible时,如何在迁移中更新数据?

Ruby on rails Rails:当我们使用attr\u accessible时,如何在迁移中更新数据?,ruby-on-rails,ruby-on-rails-3,activerecord,attr-accessible,Ruby On Rails,Ruby On Rails 3,Activerecord,Attr Accessible,当我们试图更新表中包含的某些数据时,在迁移方面出现了问题 我们的基本模型如下所示: 使用者 用户名 暗语 … 我们创建了第一次迁移,以便在模型中添加列,然后更新现有行: add_column :users, :deleted, :boolean User.all.each do |user| user.deleted = false user.save end 第二次迁移应创建last_name列,并将username列重命名为first_name: rename_column :u

当我们试图更新表中包含的某些数据时,在迁移方面出现了问题

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

使用者

用户名 暗语 … 我们创建了第一次迁移,以便在模型中添加列,然后更新现有行:

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中,但还不存在

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


您是否曾经遇到过此类问题,您能否帮助我们绕过它,因为我们希望在不编写任何SQL的情况下坚持完整的ruby代码?

使用add\u column:users、:deleted、:boolean、:default=>false。这将用save方法替换您的片段。

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

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


对于这个例子,我们可以这样做。但这是一个简单的例子,当默认值背后的逻辑更复杂时,我们不能设置硬编码的默认值,Rails必须自己工作。所有新记录的默认值总是相同的,否则这不是默认值。在更复杂的情况下,我将使用纯SQL。
execute 'UPDATE users SET deleted=0'