Использование ActiveRecord с таблицей пар ключ / значение

#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, но не был уверен, куда его поместить или как его точно прочитать. Большое спасибо!