2012-08-02 29 views
1

可能重複:
Alias for column names in Rails的Rails 3 - 列名(舊版數據庫)

我寫的ActiveRecord模型的模塊來訪問一個MySQL原有數據庫。我的問題是數據庫有一個列命名約定,看起來像這樣:groupID,metaGroupName,flagName。有沒有一種簡單的方法可以讓模型在這個命名約定中表現出色?

更新: 如果可能,我想避免使用alias_attribute方法。這不是一個小數據庫,這將是很多專欄別名。是否有ActiveRecord中的方法可以解釋我可以覆蓋的列名?

回答

1

只需添加以下到您的模型

alias_attribute :new_column_name, :myLegacyColumnName 
+0

我不需要爲每個表格中的每一列都做這件事嗎?這不是一個小數據庫... – jtdoepke 2012-08-02 01:33:38

2

你不想不斷重複自己,這是很好的。幸運的是,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

+0

這很好。我還有一個問題;我還爲主鍵添加了這個別名:'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