Я создаю модель под названием «Конфигурация», и у меня есть следующий код, и я хочу сделать его более динамичным с помощью метапрограммирования.Ruby and Rails: переменные метапрограммирования становятся методами класса
В таблице базы данных для модели конфигурации у меня есть следующие данные.
---------------------------------------------------------
variable_name as string | value in text
|
company_name | MyCompany
welcome_text | Welcome to MyCompany's App!
email_order_text | You've just created an account with MyCompany.
year_since | 2012
----------------------------------------------------------
class Configuration < ActiveRecord::Base
#nothing here yet
end
----------------------------------------------------------
В настоящее время единственный способ получить доступ к COMPANY_NAME должен сделать следующее в рельсах консоли:
configuration_company_name = Configuration.find_by_variable_name("company_name")
configuration_company_name.company_name
> "MyCompany"
Я считаю, что это неприемлемо способ делать вещи. Во-первых, он будет обращаться к базе данных каждый раз, когда кто-то проверяет имя компании. Я думаю, что если я смогу загрузить его, когда приложение запустится, и ему не придется снова обращаться к нему, потому что он в памяти, тогда было бы лучше. Как я могу сделать что-то более динамичное, чтобы я мог получить доступ к значению «MyCompany», как это.
Configuration.company_name
> "MyCompany"
Причина этого заключается в том, чтобы дать возможность быстрой настройки приложения.
Вы уверены, что это действительно проблема? Rails довольно хорош в отношении запросов кэширования к базе данных, поэтому я не ожидал запроса базы данных каждый раз, когда кто-то захочет имя company_name. Как и знаменитая цитата Дональда Кнута: «... преждевременная оптимизация - это корень всего зла». –
Я думаю, что это часть проблемы. Когда я проверяю production.log, он продолжает отправлять запрос в MySQL, что не является идеальным. Основная проблема заключается в доступе к переменным как методу класса вместо того, чтобы получить find_by_variable или где («переменная =?», Переменная), которая является уродливой. –
Просто используйте хэш. – lucapette