Подтвердить что ты не робот

Псевдоним имен столбцов в 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

Как я могу переименовать имена столбцов? Возможно ли это?

4b9b3361

Ответ 1

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

alias_attribute :new_column_name, :column_name_in_db

Ответ 2

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

object.listen-control

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

object.listen - control

и не удастся. Обнаруженный фрагмент кода может быть неудачным из-за ruby ​​1.9, а не рельсов 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 для доступа к этим столбцам таблицы, не вызывая их как рубиновые методы.

Ответ 3

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

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

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

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