我正在尝试将旧的,传统的Rails 3应用程序合并到更新的Django应用程序中。
这两个应用程序过去都使用不同的数据库,这些数据库正在合并到两个应用程序可用的唯一数据库中。Django 应用程序将慢慢接管旧 Rails 应用程序的功能,从迁移开始。
Django 在其迁移中强制执行严格的数据库约束(例如 NOT NULL
具有默认值的字段)。两个应用程序使用的表上的任何新字段都将阻止 Rails 更新该表上的记录,因为 ActiveRecord 会强制插入NULL
值而不是默认值。
由于我们不会向 Rails 应用程序添加新功能,我希望它坚持使用字段列表并忽略任何新添加的字段。
以下使用 default_scope
的答案会破坏其他范围,因此我想避免它。
触发器是一种选择,但我并不热衷于在 Django 应用程序中添加 cruft,只是为了处理 Rails 应用程序中的遗留代码。
因此:我可以在我的模型中手动定义列而不是让 ActiveRecord 自动检查数据库吗?
Rails 5 通过提供ignore_columns
选项解决了您的问题。
class User < ActiveRecord::Base
self.ignored_columns = %w(employee_email)
end
User.columns
不会在输出中给出employee_email
。
即使在古代版本的 Rails(例如 Rails 2.3)中,您也可以通过覆盖 ActiveRecord::Base.columns
来实现您想要的:
class Model < ActiveRecord::Base
def self.columns
super.reject { |c| c.name.in?(['column1', 'column2']) }
end
end
这相当于 Rails 5 中的ignore_columns
。
如果你使用的是较低版本的 Rails,则可以使用可忽略的 gem
https://github.com/nthj/ignorable
ignore_columns :属性