7

在使用 ActiveRecord 运行应用程序时从表中删除列会导致错误,因为 ActiveRecord 会缓存列名。

其他版本的 ActiveRecord 的解决方法是覆盖模型中的 #columns 方法并在迁移之前过滤掉不推荐使用的列名(基本上 - 从 AR 中隐藏这些列)。这很有效,因为所有与列名相关的方法都基于 #columns 调用

在 ActiveRecord 3.1 中,表结构的缓存被移动到 ConnectionPool,并且所有与列名相关的值(例如 coluumns_hash)都被独立缓存(3.2 使用 ModelSchema.columns 使其再次工作)

有没有什么方法(除了混凝土适配器的深度破解)来实现 ActiveRecord 3.1 中的安全列下降?

4

2 回答 2

3

TST Media 的 Luke Ludwig 在这里提供了一个解决方案。本质上,它们“覆盖了列被删除的类的 ActiveRecord::Base.columns 方法”。

(解决方案适用于除 3.1 之外的所有版本)

于 2012-09-21T09:46:47.380 回答
1

如果您有多个应用程序服务器,以便您可以一次关闭一个而无需停机,则以下方法将起作用:

  1. 删除用户修改您要删除的列的能力。
  2. 一次重新启动一个应用程序。
  3. 启动一个新数据库,它是现有数据库的主控。
  4. 停止从新数据库复制。
  5. 将列放到新的数据库服务器上。
  6. 一次重新配置每个应用程序服务器以使用新的数据库服务器并重新启动。
  7. 为您的新数据库重新打开复制。
  8. 原始服务器恢复正常后,重新配置应用程序以再次使用该数据库服务器(通过适当的重新启动)。
  9. 停止复制并关闭新的数据库服务器。
于 2012-09-28T15:21:25.353 回答