忽略 ActiveRecord 中的列

Ignore columns in ActiveRecord

我正在尝试将旧的遗留 Rails 3 应用程序合并到更新的 Django 应用程序中。

两个应用程序过去使用不同的数据库,这些数据库正在合并到一个可供两个应用程序使用的唯一数据库中。从迁移开始,Django 应用程序将慢慢接管旧 Rails 应用程序的功能。

Django 在其迁移中强制执行严格的数据库约束(例如 NOT NULL 具有默认值的字段)。两个应用程序使用的 table 上的任何新字段将阻止 Rails 更新该 table 上的记录,因为 ActiveRecord 强制插入 NULL 值而不是默认值。

由于我们不会向 Rails 应用添加新功能,我希望它坚持使用字段列表并忽略任何新添加的字段。

使用 default_scopefollowing answer 会破坏其他范围,所以我想避免它。

触发器是一个选项,但我并不热衷于向 Django 应用程序添加 cruft,只是为了处理 Rails 应用程序中的遗留代码。

因此:我可以在我的模型中手动定义列而不是让 ActiveRecord 自动检查数据库吗?

Rails 5 通过提供 ignore_columns 选项解决了您的问题。

class User < ActiveRecord::Base
  self.ignored_columns = %w(employee_email)
end

User.columns 不会在输出中给出 employee_email

如果您使用的是Rails

的低版本,您可以使用可忽略的gem

https://github.com/nthj/ignorable

ignore_columns:属性

即使在 Rails(例如 Rails 2.3)的旧版本中,您也可以通过覆盖 ActiveRecord::Base.columns:

来完成您想要的
class Model < ActiveRecord::Base
  def self.columns
    super.reject { |c| c.name.in?(['column1', 'column2']) }
  end
end

这是 equivalent to ignore_columns 在 Rails 5.