【问题标题】:Change name of updated_at column in ActiveRecord / Rails [duplicate]在 ActiveRecord / Rails 中更改 updated_at 列的名称 [重复]
【发布时间】:2014-01-04 02:10:43
【问题描述】:

我正在为旧数据库构建 JRuby on Rails 应用程序。所有表都没有“created_at”列(所以我可以继续添加),但它们都有一个“modtime”列而不是“updated_at”列。我无法将数据库中的所有列名从“modtime”更改为“updated_at”,因为许多 java 代码和 sql 函数都使用此列名。可以简单地将“updated_at”列添加到所有表中,但这会令人困惑且不太理想。

如何让 ActiveRecord 使用“modtime”而不是“updated_at”作为列名?

【问题讨论】:

  • 谢谢大家,我读了那个答案,但我不太明白:这个 active_record.rb 文件在哪里? “在初始化程序中创建一个名为该文件的文件”是什么意思?我假设我将 :modtime 放入传递给 timestamp_attributes_for_update 方法的数组中?

标签: ruby-on-rails postgresql activerecord jruby jrubyonrails


【解决方案1】:

为了让 ActiveRecord 使用 modtime 作为其更新列,您需要执行以下操作:

在 config/initializers 目录中创建一个名为 active_record_patch.rb 的文件

# config/initializers/active_record_patch.rb
module ActiveRecord
  module Timestamp      

    private

      def timestamp_attributes_for_update #:nodoc:
        [:modtime, :updated_on, :modified_at]
      end
  end
end

您在这里所做的是覆盖 ActiveRecord::Timestamp 的 timestamp_attributes_for_update 方法,该方法用于识别其更新属性的名称。该文件需要放在 config/initializers 中,因为在 Rails 应用加载后,初始化程序中的所有文件都会运行。

这是一个猴子补丁,它覆盖了 ActiveRecord::Timestamp 的正常行为,当您使用不同版本的 ActiveRecord 时可能会中断。

希望对你有帮助。

【讨论】:

  • 谢谢!这是一个清晰简洁的答案,适用于 Rails 4.0.2。
  • 这个猴子补丁悄悄地打破了时间戳的正常行为,因为原始列名是:updated_on, :updated_atupdated_at 由默认 rails 生成器为其他 AR 模型生成的列不会被更新。请澄清你的答案。
猜你喜欢
  • 2010-10-18
  • 2014-08-15
  • 2021-10-26
  • 2020-02-26
  • 1970-01-01
  • 2021-03-31
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多