忽略ActiveRecord中的列

时间:2015-06-12 08:40:02

标签: ruby-on-rails-3 postgresql activerecord

我正在尝试将旧的Rails 3应用程序合并到更新的Django应用程序中。

这两个应用程序曾经使用过不同的数据库,这些数据库被合并到两个应用程序都可用的唯一数据库中。 Django应用程序将从迁移开始慢慢接管旧Rails应用程序的功能。

Django在其迁移中强制执行严格的数据库约束(例如,NOT NULL字段具有默认值)。两个应用程序使用的表上的任何新字段都将阻止Rails更新该表上的记录,因为ActiveRecord强制插入NULL值而不是默认值。

由于我们不会在Rails应用程序中添加新功能,因此我希望它坚持使用字段列表并忽略任何新添加的字段。

使用default_scope的{​​{3}}打破了其他范围,所以我想避免使用它。

触发器是一个选项,但我并不热衷于在Django应用程序中添加cruft,只是为了处理Rails应用程序中的遗留代码。

因此:我可以手动定义模型中的列,而不是让ActiveRecord自动检查数据库吗?

3 个答案:

答案 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)

如果您使用较低版本的Rails

,则可以使用可忽略的gem

https://github.com/nthj/ignorable

ignore_columns:attributes