2012-08-02 38 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