2010-12-03 68 views
3

我正在爲舊數據庫編寫Rails應用程序。這個遺留數據庫中的一個表格有一個名爲object_id的列。不幸的是,object_id也是Ruby中每個對象的屬性,所以當ActiveRecord試圖使用這些對象來制定查詢時,它使用的是Ruby定義的object_id,而不是數據庫中的值。使用Rails/ActiveRecord覆蓋或使用舊數據庫中的別名名稱

傳統的應用程序有超過一百萬行代碼,因此只需更改數據庫中列的名稱即可作爲最後選擇。

問題:
1.有什麼辦法讓ActiveRecord/Rails使用這個列的別名或同義詞嗎?
2. Ruby中有什麼方法可以使object_id方法的行爲有所不同,具體取決於誰在調用它?
3.我可以簡單地覆蓋我的模型中的object_id方法的行爲(我認爲這是一個可怕的想法,但不得不問)

任何建議,非常感謝。

回答

2

我只是那種spitballing這裏,但你可以嘗試這樣的:

class Legacy < ActiveRecord::Base 
    #... all the other stuff 

    #give yourself a way to access the DB version of object_id 
    def oid 
    attributes[:object_id] 
    end 
    def oid=(val) 
    attributes[:object_id]=val 
    end 

    #restore ruby's default #object_id implementation 
    def object_id 
    super 
    end 
end 
+0

感謝您的意見。這絕對有助於解決問題的一部分。問題的另一部分是ActiveRecord在生成where子句時需要調用原始列名稱。例如,當我執行'Object.find_by_oid(3)'時,它將生成`select * from object_table where oid = 3`,這將導致錯誤,因爲在數據庫中該列實際上並不被稱爲oid。 – mberning 2010-12-03 20:14:48

相關問題