有没有办法重命名ActiveRecord模型列?

时间:2011-02-28 21:33:26

标签: ruby-on-rails activerecord

我正在考虑选择rails'ActiveRecord来访问旧数据库。它的名字真的很混乱,所以在模型中使用它的列名不是一个好主意。

设置表名非常简单。但是,我是否只能在模型中重命名列名?

约定优于配置,但在这种情况下,我无法更改旧数据库名称。

使用ActiveSupport中的alias_attribute无法解决我的问题,因为该对象在序列化或打印时仍显示旧版列名。例如,我需要以JSON格式返回这些模型,并且alias_attribute不适用于此。

2 个答案:

答案 0 :(得分:4)

在模型中使用alias_attribute。 e.g。

alias_attribute :new_column_name, :column_name_in_db

有关详细信息,请参阅:https://stackoverflow.com/a/4017071/445908

答案 1 :(得分:3)

我做了什么来实现这个目标?

下面的代码会覆盖默认的ActiveModel :: Serialization的serializable_hash,并在其中转换列名。不完整,也许一些重构会很好,但它正在工作;)

模型示例:

class Account < ActiveRecord::Base
  include ActiveModel::ColumnNaming

  set_table_name 'conta_tbl'
  set_primary_key 'cod_conta'

  rename_columns ({
    id:                   'cod_conta',
    billing_group_id:     'id_cobranca',
    invoice_id:           'cod_pagamento'
  })
end

<强>码

module ActiveModel
  module ColumnNaming
    extend ActiveSupport::Concern

    def serializable_hash(options = nil)
      hash = super(options)
      self.class.columns_map.each do |legacy, renamed|
        hash[renamed] = hash.delete(legacy)
      end
      hash
    end

    module ClassMethods
      def columns_map
        @columns_map
      end

      def rename_columns(map)
        @columns_map = map.invert
        columns_map.each { |key, value| alias_attribute value.to_sym, key.to_sym }
      end
    end
  end
end