Реализация динамических методов в рельсах для пары ключ / значение

Допустим, у меня есть таблица базы данных под названием '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, поэтому вы можете просмотреть этот код и найти ответ, который ищете.

Другие вопросы по тегам