Псевдоним для имен столбцов в Rails - PullRequest
63 голосов
/ 25 октября 2010

В моей базе данных есть имена столбцов, такие как «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 ]

142 голосов
/ 25 октября 2010

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

alias_attribute :new_column_name, :column_name_in_db
7 голосов
/ 25 октября 2010

Псевдонимы имен методов не решат вашу проблему.Как я упоминал в моем комментарии выше, вы не можете иметь тире в именах методов или переменных 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.

0 голосов
/ 25 октября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...