#ruby-on-rails #activerecord
#ruby-on-rails #activerecord
Вопрос:
У меня есть существующая таблица из сторонней базы данных, к которой я подключаюсь, в которой хранятся пары ключ / значение. Два столбца, один для «param», а другой для «paramvalue». Мне нужно получить доступ к этим сохраненным значениям для приложения-плагина, которое я разрабатываю, и я пытаюсь придумать лучший способ перевести значения в самый простой формат для использования во всем приложении. Я думал о том, чтобы каким-то образом создавать динамические методы в модели AR, которые я мог бы вызывать на основе имени параметра. Что-то вроде SysParams.base_url, который будет сопоставляться с записью для [base_url,http://www.thesite.com ]. Что-то вроде встроенных методов AR для таких вещей, как Record.find_by_column_name
Окончательный вопрос: возможно ли что-то подобное? Если да, то это хорошая идея? Если да, то как бы это сделать?
Комментарии:
1. изменяется ли ваша сторонняя база данных или пары ключ / значение постоянны? Если они постоянны, сколько у вас k / v пар? десятки? сотни? тысячи?
2. Хорошие вопросы. Я не ожидаю, что БД сильно изменится. В настоящее время в этой таблице менее 25 записей. Ключ / значения не устанавливаются каким-либо образом, доступным пользователям, только администраторам с прямым доступом к БД, поэтому ключи / значения должны быть в значительной степени предсказуемыми.
3. Возможно, мета-метод в модели, которому я мог бы передать имя ключа в качестве параметра, был бы немного проще в моем случае. Что-то вроде SysParam.getsetting(‘keyname’), которое возвращало бы значение.
4. Я попытался поместить некоторые постоянные переменные в контроллер приложения, который просто извлекал значения из базы данных по имени, но это означало, что эти значения задавались для каждого действия. Совсем не идеально. Есть ли способ, которым я могу получить эти значения в кеш Rails и просто оставить их там до перезагрузки?
Ответ №1:
вот как я справляюсь с такими вещами, но это хорошая идея, только если количество ключей не слишком велико.
1. Создайте модель для доступа к вашей БД, подобную этой:
app/models/config_table.rb
class ConfigTable < ActiveRecord::Base
# whatever you need here
end
2. Создайте инициализатор
config/initializers/admin_config.rb
class AdminConfig
# uncomment this if in development
#unloadable
# I assume you have the fields key/value in your
# ConfigTable you may need to change this
def self.all
# create a cached hash
@cache ||= ConfigTable.all.inject({}) do |hsh, c_config|
hsh[c_config.key.to_sym] = c_config.value
hsh
end
end
def self.get(key)
self.all[key.to_sym]
end
def self.[](key)
self.all[key.to_sym]
end
end
Примеры использования (в любом месте вашего Appp):
AdminConfig.get(:hostname)
AdminConfig.get('hostname')
AdminConfig[:hostname]
AdminConfig['hostname']
Если вам нужно перезагрузить конфигурацию из-за изменений, вам придется перезапустить все запущенные экземпляры приложения. Конечно, вам может потребоваться адаптировать названия таблицы / столбцов 🙂
Если вам нужно решение для больших наборов ключей / значений, я рекомендую вам сохранить его в кэше rail и, возможно, использовать redis-store 🙂
Получайте удовольствие
Комментарии:
1. Это сделало это. Я полагал, что хэшированное значение / набор ключей будет фигурировать в somehwere, но не был уверен, куда его поместить или как его точно прочитать. Большое спасибо!