忽略ActiveRecord中的列

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在输出中给出.


fot*_*tos 8

即使在旧版本的 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 中。