Псевдоним для имен столбцов в Rails

В моей базе данных есть имена столбцов, такие как "delete" или "listen-control" и так далее. Они не могут быть изменены, поэтому я хотел бы использовать псевдонимы, чтобы избежать проблем в моем приложении.

Я нашел следующий код, но он устарел (05 августа 2005 г.) и не работает с Rails 3:

module Legacy
  def self.append_features(base)
    super
    base.extend(ClassMethods)
  end
  module ClassMethods
    def alias_column(options)
      options.each do |new_name, old_name|
        self.send(:define_method, new_name) { self.send(old_name) }
        self.send(:define_method, "#{new_name}=") { |value| self.send("#{old_name}=", value) }
      end
    end
  end
end

ActiveRecord::Base.class_eval do
  include Legacy
end

Как я могу псевдоним имен столбцов? Является ли это возможным?

3 ответа

Объявите это в вашей модели.

alias_attribute :new_column_name, :column_name_in_db

Псевдонимы имен методов не решат вашу проблему. Как я упоминал в моем комментарии выше, вы не можете иметь тире в именах методов или переменных ruby, потому что ruby ​​будет интерпретировать их как "минус". так:

object.listen-control

будет интерпретироваться как ruby:

object.listen - control

и потерпит неудачу. Обнаруженный вами фрагмент кода может давать сбой из-за ruby ​​1.9, а не rails 3. Ruby 1.9 не позволяет вам звонить .send на защищенных или приватных методах, как 1.8 раньше.

При этом я понимаю, что бывают случаи, когда имена старых столбцов базы данных выглядят не очень красиво, и вы хотите их очистить. Создайте папку в вашей папке lib под названием "bellmyer". Затем создайте файл с именем "create_alias.rb" и добавьте следующее:

module Bellmyer
  module CreateAlias
    def self.included(base)
      base.extend CreateAliasMethods
    end

    module CreateAliasMethods
      def create_alias old_name, new_name
        define_method new_name.to_s do
          self.read_attribute old_name.to_s
        end

        define_method new_name.to_s + "=" do |value|
          self.write_attribute old_name.to_s, value
        end
      end
    end
  end
end

Теперь в вашей модели, которая требует псевдонимов, вы можете сделать это:

class User < ActiveRecord::Base
  include Bellmyer::CreateAlias
  create_alias 'name-this', 'name_this'
end

И это будет псевдоним правильно. Это использует read_attribute а также write_attribute методы ActiveRecord для доступа к этим столбцам таблицы, не вызывая их как методы ruby.

Как сказал Хайме, эти имена могут вызвать проблемы.

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

Предложения: is_deleted или же deleted_at, listen_control

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

Другие вопросы по тегам