Реализация динамических методов в рельсах для пары ключ / значение
Допустим, у меня есть таблица базы данных под названием 'options' с соответствующей моделью под названием Option. Структура этой таблицы проста и выглядит следующим образом...
id -> primary key, auto increment
name -> key
value -> value for the key
Пример строки данных может быть следующим...
id name value
---- ---------------------------- -----------
1 default_view DAILY
2 show_registration_number 0
3 notification_method IMMEDIATE
Я хочу, чтобы все параметры (ключи) были доступны для меня как имена методов.
Например, если сделать следующее
@options = Options.find(:all)
Можно ли получить доступ к данным, как @options.default_view
который должен вернуть мне значение как "ЕЖЕДНЕВНО" и аналогично @options.show_registration_number
который должен вернуть значение как 0.
Также, если это возможно, допустимо ли изменение, как если бы @options.default_view = 'MONTHLY'
и должен обновить соответствующую запись в базе данных.
1 ответ
Это даст вам почти тот ответ, который вы искали: http://code.dblock.org/how-to-define-enums-in-ruby
Опирается на const_missing
и предполагает, что элементы вашего "enum" определены как константы, в вашем случае Option::default_view
Тем не менее, легко увидеть, как адаптировать этот код для использования method_missing
так что вы можете сделать Option.default_view
Другой пример такого же подхода содержится в геме rails-settings, поэтому вы можете просмотреть этот код и найти ответ, который ищете.