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