2013-12-16 48 views
2

我正在构建旧版数据库的JRuby on Rails应用程序。没有一个表的'created_at'列(所以我可以继续前进并添加),但他们都有'modtime'列而不是'updated_at'列。由于大部分java代码和sql函数都使用此列名,所以我无法将所有列名中的'modtime'更改为'updated_at'。可以简单地将“updated_at”列添加到所有表中,但这会造成混淆,并不理想。更改ActiveRecord/Rails中updated_at列的名称

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

+0

看看这个答案:http://stackoverflow.com/a/3981571/2622934 – cschroed

+0

谢谢你们,我读了这个答案,但我真的不明白它:这个active_record.rb文件去哪里? “在初始化程序中创建一个名为的文件”的含义是什么?我假设我把数组中的modtime传递给timestamp_attributes_for_update方法? – eljaydub

回答

1

这里就是你需要做什么ActiveRecord的使用modtime作为其更新列:

中创建一个名为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时,它可能会中断。

希望它有帮助。

+0

谢谢!这是一个清晰而简洁的答案,适用于Rails 4.0.2。 – eljaydub

+1

这个猴子补丁悄然打破了Timestamp的正常行为,因为原始列名是[:updated_on,:updated_at](https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/ timestamp.rb#L91)。其他AR模型的默认导轨生成器生成的'updated_at'列不会被更新。请澄清你的答案。 –