2009-06-26 109 views
1

ActiveRecord中是否可以自定義/覆蓋屬性的名稱,使其與數據庫中的列名不匹配?Rails中的自定義命名屬性

我的具體情況涉及遺留列「修訂版」,目前我無法刪除。列名與acts_as_audited衝突。直到我的遷移完成之前,哪些原因會遺漏我需要的遺留代碼。

我希望的解決方案是覆蓋此列的屬性名稱,並更新調用它的幾個區域。因此允許傳統列與acts_as_audited一起生活。

回答

3

我沒有使用acts_as_audited,但我假設它的實現覆蓋了該列的訪問器。在這種情況下,你應該能夠只是做這樣的事情:

class ActiveRecord::Base 
    def self.name_column(column_name, new_name) 
    define_method(new_name) {read_attribute column_name} 
    define_method("#{new_name}=") {|value| write_attribute column_name, value} 
    define_method("#{new_name}?") {attribute_present? column_name} 
    end 
end 

這些將直接訪問column_name列名爲無需經過重寫的訪問會。

哦,獎金複製摧毀元編程回答:

class ActiveRecord::Base 
    def self.name_column(column_name, new_name) 
    { '' => :read_attribute, 
     '=' => :write_attribute, 
     '?' => :attribute_present? }.each do |suffix,method| 
     define_method("#{new_name}#{suffix}") {|*args| send method, column_name, *args} 
    end 
    end 
end 

只是因爲我喜歡展示它是如何做。

+0

我會給這個鏡頭,讓你知道。很好的元。 – catalpa 2009-06-26 22:02:21

0

創建遷移以將列從修訂版重命名爲任何你想要的。 然後,您可以聲明一個attr_accessor:修訂版並使用它,而無需將該屬性映射到數據庫字段。

+0

attr_accessor不適用於acts_as_audited,b/c它具有任何正在審計的模型的屬性修訂版。這個重寫正在導致我的問題。該屬性本身需要一個新的名稱,但我試圖完成這個沒有數據庫更改。我將離開那作爲最後的手段。 – catalpa 2009-06-26 20:52:44