F.X*_*.X. 6 postgresql activerecord ruby-on-rails-3
我正在尝试将旧的,传统的Rails 3应用程序合并到更新的Django应用程序中.
这两个应用程序曾经使用过不同的数据库,这些数据库被合并到两个应用程序都可用的唯一数据库中 Django应用程序将从迁移开始慢慢接管旧Rails应用程序的功能.
Django在其迁移中强制执行严格的数据库约束(例如,NOT NULL具有默认值的字段).两个应用程序使用的表上的任何新字段都将阻止Rails更新该表上的记录,因为ActiveRecord强制插入NULL值而不是默认值.
由于我们不会向Rails应用程序添加新功能,因此我希望它坚持使用字段列表并忽略任何新添加的字段.
在以下的答案必须使用default_scope中断其它的范围,所以我想,以避免它.
触发器是一个选项,但我并不热衷于在Django应用程序中添加cruft,只是为了处理Rails应用程序中的遗留代码.
因此:我可以手动定义模型中的列,而不是让ActiveRecord自动检查数据库吗?
小智 10
Rails 5通过提供ignore_columns选项解决您的问题.
class User < ActiveRecord::Base
self.ignored_columns = %w(employee_email)
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这相当于ignore_columns在 Rails 5 中。