我寫的ActiveRecord模型的模塊來訪問一個MySQL原有數據庫。我的問題是數據庫有一個列命名約定,看起來像這樣:groupID
,metaGroupName
,flagName
。有沒有一種簡單的方法可以讓模型在這個命名約定中表現出色?
更新: 如果可能,我想避免使用alias_attribute
方法。這不是一個小數據庫,這將是很多專欄別名。是否有ActiveRecord中的方法可以解釋我可以覆蓋的列名?
我寫的ActiveRecord模型的模塊來訪問一個MySQL原有數據庫。我的問題是數據庫有一個列命名約定,看起來像這樣:groupID
,metaGroupName
,flagName
。有沒有一種簡單的方法可以讓模型在這個命名約定中表現出色?
更新: 如果可能,我想避免使用alias_attribute
方法。這不是一個小數據庫,這將是很多專欄別名。是否有ActiveRecord中的方法可以解釋我可以覆蓋的列名?
只需添加以下到您的模型
alias_attribute :new_column_name, :myLegacyColumnName
你不想不斷重複自己,這是很好的。幸運的是,Ruby使它變得相當簡單。你可以試試下面的:
class Model < ActiveRecord::Base
column_names.each do |cn|
alias_attribute cn.underscore.intern, cn
end
end
我倒是那麼的因素是出到Module
也許像這樣:
module AliasLegacyColumns
extend ActiveSupport::Concern
included do
column_names.each {|cn|
alias_attribute cn.underscore.intern, cn
}
end
end
然後就包含在你的模型是必要的。爲了進一步細化,我會提供一個alias_columns
類級別的方法,接受參數如:include
或:exclude
,因此您可以使用所述模塊對所有模塊進行monkey-patch ActiveRecord::Base
,但只根據需要調用alias_columns
。
這很好。我還有一個問題;我還爲主鍵添加了這個別名:'alias_attribute(:id,primary_key),除非primary_key.nil?'。但是,如果我嘗試像'LegacyModel.select(:id)'這樣的東西,我會得到'id'列不存在的MySQL錯誤。它看起來像關係沒有使用別名。這可能是[這裏]描述的問題(http://stackoverflow.com/a/4433374/440292)。 'LegacyModel.find(some_id)'和'LegacyModel.first.id'都可以工作。 – jtdoepke 2012-08-02 07:12:17
我不需要爲每個表格中的每一列都做這件事嗎?這不是一個小數據庫... – jtdoepke 2012-08-02 01:33:38