【问题标题】:Is there a way to rename ActiveRecord model columns?有没有办法重命名 ActiveRecord 模型列?
【发布时间】:2013-01-07 16:55:19
【问题描述】:

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

设置表名非常简单。但是我有没有办法重命名列名,只在模型中?

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

使用 ActiveSupport 中的 alias_attribute 并不能解决我的问题,因为对象在序列化或打印时仍会显示旧列名。例如,我需要以 JSON 格式返回这些模型,而 alias_attribute 不适合这种情况。

【问题讨论】:

  • 看起来像 [Alias for column names in Rails] 的副本:stackoverflow.com/questions/4014831/…
  • 并非如此。他在谈论别名列,这里的问题略有不同。它的所有答案都不适用于我需要在这里做的事情。
  • 到目前为止,我认为最好的选择是重写 ActiveModel::Serialization serializable_hash 方法。不适合所有人,只适合这些模型。

标签: ruby-on-rails activerecord


【解决方案1】:

在您的模型中使用 alias_attribute。例如

alias_attribute :new_column_name, :column_name_in_db

更多详情请参考:https://stackoverflow.com/a/4017071/445908

【讨论】:

    【解决方案2】:

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

    下面的代码覆盖了默认的 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
    

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 2011-03-26
      • 2016-12-08
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多