Есть ли способ переименовать столбцы модели ActiveRecord? - PullRequest
4 голосов
/ 01 марта 2011

Я думаю о выборе рельсов ActiveRecord для доступа к устаревшей базе данных. Его имена действительно сбивают с толку, поэтому было бы неплохо использовать имена его столбцов в модели.

Задать имя таблицы очень просто. Но у меня есть способ переименовать имя столбца, только в модели?

Соглашение о конфигурации прекрасно, но в этом случае я не могу изменить устаревшие имена баз данных.

Использование alias_attribute из ActiveSupport не решает мою проблему, поскольку объект по-прежнему показывает устаревшие имена столбцов при сериализации или печати. Например, мне нужно вернуть эти модели в формате JSON, и alias_attribute не подойдет для этого.

Ответы [ 2 ]

4 голосов
/ 07 января 2013

используйте alias_attribute в вашей модели.например,

alias_attribute :new_column_name, :column_name_in_db

для получения более подробной информации см. https://stackoverflow.com/a/4017071/445908

3 голосов
/ 01 марта 2011

Что я сделал, чтобы добиться этого?

Приведенный ниже код перезаписывает значение по умолчанию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...