Эффективно хранить / извлекать глобальные настройки для приложения Rails в БД - PullRequest
1 голос
/ 14 февраля 2011

У меня есть ряд глобальных настроек приложения, которые хранятся в таблице под названием «настройки» в БД.Он имеет три столбца: id, ключ, значение.

Теперь допустим, у меня есть список товаров, в котором перечислены, скажем, 30 товаров.Отображение каждого из этих продуктов требует извлечения определенной настройки «обменный курс» из таблицы настроек.Я сделал это, добавив функцию «exchange_rate» к помощнику приложения, который ищет строку настроек с ключом «обменный курс» и получает значение.

Что теперь не так, спросите вы?Ну, на самом деле ничего, все работает просто отлично, но когда я просматриваю журнал сервера разработки, я замечаю, что в каждом запросе есть 30 таких записей:

CACHE (0.0ms) SELECT settings. * FROM settings WHERE(settings. key = 'exchange_rate') LIMIT 1

CACHE (0,0 мс) SELECT settings. * FROM settings WHERE (settings. key = 'exchange_rate')LIMIT 1

Это выглядит ужасно и загромождает мой журнал.Причина очевидна: запись в БД извлекается 30 раз.Кажется, что он не загружается в БД, потому что там написано CACHE, поэтому проблем с производительностью не должно быть (или есть? Я не знаю).

Мой вопрос: будет ли это«чище» и разумнее извлечь эту глобальную переменную (обменный курс) ОДИН РАЗ, а затем сохранить ее где-нибудь (где?), чтобы я не получил эти, казалось бы, избыточные (хотя и кэшированные) запросы БД?

1 Ответ

3 голосов
/ 15 февраля 2011

Да, лучший способ обойти это - сохранить значение в переменной класса.Например:

class Settings
  def self.exchange_rate
    @@exchange_rage ||= (execute your SQL query and get the result here)
  end
end

Таким образом, каждый раз, когда вы вызываете Settings.exchange_rate, вы будете выполнять запрос только в первый раз.В остальное время будет использоваться переменная класса @@ exchange_rate.

В исходном примере единственным влиянием на производительность является генерация SQL-запроса и попадание в кеш, поэтому он определенно существует, ноне так плохо, как на самом деле попадание в базу данных каждый раз, когда вы хотите обменный курс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...