Ответ 1
Объявите это в своей модели.
alias_attribute :new_column_name, :column_name_in_db
В моей базе данных есть имена столбцов, такие как "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 будет интерпретировать их как "минус". так:
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 для доступа к этим столбцам таблицы, не вызывая их как рубиновые методы.
Как сказал Хайме, эти имена могут вызвать проблемы.
В этом случае используйте некоторые разумные имена. Ваш графический интерфейс никогда не должен диктовать, как называются ваши столбцы.
Предложения: is_deleted
или deleted_at
, listen_control
Затем измените свой взгляд соответственно, таким образом, проще, чем сражаться с ActiveRecord и вашей базой данных.