Если у нас есть небольшая таблица, которая содержит относительно статические данные, можно ли активировать Active Record при запуске приложения и никогда не ударять по базе данных для этих данных?Rails 5 Active Record - возможно ли сохранить таблицу в памяти?
Обратите внимание, что в идеале я хотел бы, чтобы эти данные были объединены в другие модели, имеющие отношения к нему.
Примером может служить список стран с их префиксным номером телефона - этот список вряд ли изменится, и если бы это было сделано, это было бы изменено администратором. Другие таблицы могут иметь отношения с этим (например, с учетом Пользователя, имеющего ссылку на страну, мы можем захотеть найти телефонный код страны).
Я видел аналогичный вопрос here, но ему 6 лет и относится к Rails 2, в то время как я использую Rails 5 и, возможно, с тех пор что-то было введено.
Предпочтительные растворы будут:
- Встроенная функциональность Рельсы/ActiveRecord, чтобы загрузить таблицу один раз при запуске, и если другие записи впоследствии загружены, в которых есть отношения с кэш-таблице, то ссылку на кэшированную объектов (например, вручную кэшировать MyModel.all где-то недостаточно, так как отношения будут по-прежнему загружаться при запросе базы данных).
- Поддерживается библиотека, которая делает выше.
- Если ни один из них не доступен, я полагаю, что альтернативным методом было бы определить статический набор данных как enum/hash в памяти или аналогичный, и сохранить хэш-ключ в записях, которые имеют отношение к этим данным, и определить методы на эти модели для поиска с использованием объекта в хэше с использованием ключа, сохраненного в базе данных. Это кажется вполне руководство, хотя ...
[EDIT] Еще одна вещь, чтобы рассмотреть с потенциальными решениями - ручное решение (3) также потребует пользовательские контроллеры и маршруты для таких данных, чтобы быть доступными над API. В идеале было бы неплохо иметь решение, в котором такие данные могут быть предложены через API RESTful (только для чтения - только GET), если это необходимо, с использованием стандартных механизмов рельсов, таких как строительные леса, без чрезмерного вмешательства вручную.
Вы можете использовать 'enum' – RSB
@RSB - Возможно, я ошибаюсь, но не' enum' эффективно действует как строковый идентификатор для числа? Значение enum может быть только одним значением, а не сложным объектом? Это может пригодиться в некоторых обстоятельствах, но я не уверен, что он будет здесь подходящим. например. Если в качестве примера мы снова возьмем префикс страны -> телефон, нам нужна как часть страны, так и телефонная префиксная часть. Кроме того, если у нас есть «Пользователь» и «Компания», им может потребоваться доступ к одному и тому же адресу страны -> телефонному сопоставлению, так что нужно было бы дублировать перечисление в обоих классах модели (или в каком-то родительском классе)? Спасибо – asibs
Я думаю, вам придется использовать опцию 3. 1, на самом деле невозможно, что это не так, как работает sql. вы должны запрашивать базы данных, они являются отдельными технологиями. 2 зависит от того, какую библиотеку вы ищете. Например, Carmen отлично подходит для стран/штатов и хранит эти данные в файлах yml https://github.com/jim/carmen, но если это не те данные, которые вы ищете, тогда вам придется урегулировать для использования их подходов (yml-файлов), которые обновляются вручную. – Sean