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