Где лучшее место для хранения параметров приложения: база данных, файл, код...?

Я разрабатываю сайт Ruby on Rails, и у меня есть "архитектурный" вопрос: моему приложению нужны некоторые параметры, и мне интересно, где их хранить.

В конкретных терминах мое приложение получает некоторые запросы, которые оцениваются и затем отправляются. Таким образом, модель запроса должна иметь атрибуты, относящиеся к этим методам лечения: статус проверки и статус отправки. Например, статус проверки может быть "принят", "отклонен" или "ждать". Статус отправки может быть "отправлен", "ждать", "ошибка при отправке" или тому подобное. Я должен хранить эти параметры кодов состояния где-нибудь, но я не знаю, что является лучшим решением.

Я мог бы создать модель для каждого из них и сохранить их в базе данных (и, например, иметь активную модель записи ValidationStatus), но: не было бы укусом чрезмерно создавать базу данных/модель для хранения таких данных?

Я мог бы просто использовать их в коде без их "хранения", я мог бы хранить их в файле YAML...

Итак, более простой вопрос: как вы работаете со своими параметрами приложения в RoR?

Ответ 1

Существует множество плагинов глобальной конфигурации, большинство из которых вращаются вокруг идеи загрузки файла YAML в какой-то момент. Проверьте эту страницу, этот плагин и даже этот Railscast.

Ответ 2

Я поместил их в базу данных. У меня их много, и все они довольно простые списки строк. Таблицы одинаковы: id, name, description.

Я создаю для них модели, а не фактический файл модели для каждого. В приложении/моделях у меня есть файл с именем active_record_enums.rb, который в вашем случае будет выглядеть примерно так:

ACTIVE_RECORD_ENUMS = %w{
  ValidationStatus
  SendingStatus
}

ACTIVE_RECORD_ENUMS.each do |classname|
  eval "class #{classname} < ActiveRecord::Base; end"
  classname.constantsize.class_eval do 
    # Add useful methods - id_for(name) and value_for(id) are handy
  end
end

Этот файл должен быть где-то в файле конфигурации; кроме этого это довольно просто.

Ответ 3

Я не использую Ruby, но я скажу вам, что начал (в ASP.NET) множество настроек в файле Web.Config(аналогично YAML). Однако с течением времени система развивалась до такой степени, что разные экземпляры нуждались в разных настройках. Таким образом, почти все они переместились в базу данных. Итак... если вы будете развертывать несколько экземпляров вашего сайта, я настоятельно рекомендую хранить настройки в таблице вашей базы данных (у меня есть только одна запись с полями для различных настроек). Если бы я сделал это, чтобы начать, я бы сэкономил значительное количество времени.

Ответ 4

Я обычно делаю столбцы string для каждого и использую validates_inclusion_of, чтобы установить, что приемлемо для них.

class Request < ActiveRecord::Base
  validates_inclusion_of :validation_status, :in => ['accepted','rejected','waiting']
  validates_inclusion_of :sending_status, :in => ['sent','waiting','...']
end

Если вам нужно, чтобы что-то произошло (то есть отправленные сообщения электронной почты), когда состояние изменилось, просмотрите с помощью Acts As State Machine плагин для управления им.

Ответ 5

(С тех пор считается, что рельсы, упомянутые выше [эпизод 85] - это выглядит немного больше "пути рельсов", чем ниже)

Другой подход заключается в построении существующего механизма конфигурации в Rails. Предположим, что существуют два типа конфигураций:

  • Общие конфигурации приложений, общие для сред dev/test/prod
  • Конфигурации, специфичные для envrionments dev/test/prod

Для первого сценария работают элементы в "RAILS_ROOT +" /config/environment.rb ". Просто посмотрите, что имена заглавны, поэтому они являются константами Ruby. Вариант этого - ссылка на другой файл в файле environment.rb...

require RAILS_ROOT + '/config/appConfigCommon.rb'

и поместите соответствующие файлы конфигурации в этот файл. Это имеет то преимущество, что можно ссылаться независимо от Rails.

Для сценария 2 можно сделать аналогичный подход. Поместите элементы для разработки в "RAILS_ROOT +" /config/environments/development.rb "или что-то вроде

require RAILS_ROOT + '/config/environments/appConfigDev.rb'

и поместите объекты, специфичные для среды, в требуемый файл, убедившись, что они начинаются с шапок. И следуйте той же схеме для test/prod (и другие, если потребуется).

Элементы конфигурации доступны непосредственно в представлениях и контроллерах (не уверены в моделях), просто используя имя константы.