Псевдоним для имен столбцов в 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 и вашей базой данных.