Я помню, как просматривал рубиновый скринкаст от Дейва Томаса об использовании метапрограммирования для создания имен методов, которым не нужно придерживаться требований синтаксиса идентификатора. Как правило, идентификатор не должен содержать пробелов. И он показал, как создавать методы с пробелами. Но я не помню, как это делается.Ruby: Обращайтесь с произвольными именами методов
У меня есть произвольные имена полей для класса, которые include
s Mongoid :: Document. Это отлично работает, где _field может быть строкой типа «Hello World»:
MyClass.class_eval <<-EOS
field :'#{ _field }', type: #{_type}
EOS
Я хочу переопределить сеттер. Так что я попытался это:
MyClass.class_eval <<-EOS
field :'#{ _field }', type: #{_type}
def #{ _field }=(val)
self['#{ _field }'] = [self.send('#{ _field }')[0], val]
end
EOS
К сожалению, если _field это строка, как «Hello World», я получаю сообщение об ошибке:
SyntaxError: (eval):2: formal argument cannot be a constant
def Hello World=(val)
Как я могу обойти это?
Просто потому, что свойство называется «Hello World» внутри MongoDB, это не значит, что вы должны (или даже должны) использовать это имя в Ruby. Часть работы ORM/ODM заключается в том, чтобы справиться с несоответствием импеданса между базой данных и кодом, использующим O [RD] M, переименование свойств/полей базы данных в соответствии с соглашениями атрибутов Ruby, несомненно, будет частью этого. –
Вы знаете, что Mongoid поддерживает [динамические поля] (https://docs.mongodb.com/ruby-driver/master/tutorials/6.0.0/mongoid-documents/#dynamic-fields) из коробки, aren Не так ли? – Stefan
@muistooshort вы правы. Мое решение состояло в том, чтобы использовать: как вариант Mongoid обеспечивает: field: «Hello World», введите: Array, as:: hello_world – Donato