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

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

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

     alias_attribute :new_column_name, :column_name_in_db 

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

     object.listen-control 

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

     object.listen - control 

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

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

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

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

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

    Давайте будем гением компьютера.