ActiveRecord中是否可以自定義/覆蓋屬性的名稱,使其與數據庫中的列名不匹配?Rails中的自定義命名屬性
我的具體情況涉及遺留列「修訂版」,目前我無法刪除。列名與acts_as_audited衝突。直到我的遷移完成之前,哪些原因會遺漏我需要的遺留代碼。
我希望的解決方案是覆蓋此列的屬性名稱,並更新調用它的幾個區域。因此允許傳統列與acts_as_audited一起生活。
ActiveRecord中是否可以自定義/覆蓋屬性的名稱,使其與數據庫中的列名不匹配?Rails中的自定義命名屬性
我的具體情況涉及遺留列「修訂版」,目前我無法刪除。列名與acts_as_audited衝突。直到我的遷移完成之前,哪些原因會遺漏我需要的遺留代碼。
我希望的解決方案是覆蓋此列的屬性名稱,並更新調用它的幾個區域。因此允許傳統列與acts_as_audited一起生活。
我沒有使用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
只是因爲我喜歡展示它是如何做。
創建遷移以將列從修訂版重命名爲任何你想要的。 然後,您可以聲明一個attr_accessor:修訂版並使用它,而無需將該屬性映射到數據庫字段。
attr_accessor不適用於acts_as_audited,b/c它具有任何正在審計的模型的屬性修訂版。這個重寫正在導致我的問題。該屬性本身需要一個新的名稱,但我試圖完成這個沒有數據庫更改。我將離開那作爲最後的手段。 – catalpa 2009-06-26 20:52:44
我會給這個鏡頭,讓你知道。很好的元。 – catalpa 2009-06-26 22:02:21