忽略 ActiveRecord 中的列
Ignore columns in ActiveRecord
我正在尝试将旧的遗留 Rails 3 应用程序合并到更新的 Django 应用程序中。
两个应用程序过去使用不同的数据库,这些数据库正在合并到一个可供两个应用程序使用的唯一数据库中。从迁移开始,Django 应用程序将慢慢接管旧 Rails 应用程序的功能。
Django 在其迁移中强制执行严格的数据库约束(例如 NOT NULL
具有默认值的字段)。两个应用程序使用的 table 上的任何新字段将阻止 Rails 更新该 table 上的记录,因为 ActiveRecord 强制插入 NULL
值而不是默认值。
由于我们不会向 Rails 应用添加新功能,我希望它坚持使用字段列表并忽略任何新添加的字段。
使用 default_scope
的 following 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.
我正在尝试将旧的遗留 Rails 3 应用程序合并到更新的 Django 应用程序中。
两个应用程序过去使用不同的数据库,这些数据库正在合并到一个可供两个应用程序使用的唯一数据库中。从迁移开始,Django 应用程序将慢慢接管旧 Rails 应用程序的功能。
Django 在其迁移中强制执行严格的数据库约束(例如 NOT NULL
具有默认值的字段)。两个应用程序使用的 table 上的任何新字段将阻止 Rails 更新该 table 上的记录,因为 ActiveRecord 强制插入 NULL
值而不是默认值。
由于我们不会向 Rails 应用添加新功能,我希望它坚持使用字段列表并忽略任何新添加的字段。
使用 default_scope
的 following 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
的低版本,您可以使用可忽略的gemhttps://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.