2013-12-16 100 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'列不會被更新。請澄清你的答案。 –