我正在考虑选择rails'ActiveRecord来访问旧数据库。它的名字真的很混乱,所以在模型中使用它的列名不是一个好主意。
设置表名非常简单。但是,我是否只能在模型中重命名列名?
约定优于配置,但在这种情况下,我无法更改旧数据库名称。
使用ActiveSupport中的alias_attribute无法解决我的问题,因为该对象在序列化或打印时仍显示旧版列名。例如,我需要以JSON格式返回这些模型,并且alias_attribute不适用于此。
答案 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