Предотвратить множественный вызов базы данных (чтение из памяти) - PullRequest
0 голосов
/ 28 июня 2019

У меня есть база данных с таблицей продуктов. Таблица содержит только 7 элементов и предпочла бы иметь возможность хранить их все в памяти, а не в базе данных, но мне все же хотелось бы использовать возможность вывода типа активной записи. find_by, first, last, .where (некоторый параметр запроса).

Возможно ли это в рельсах 5.2 с Postgres 11?

Я читал о памяти sqlite3, но не уверен, что это лучшее использование. Я также предпочел бы не переключать все мое приложение на sqlite.

Ответы [ 3 ]

1 голос
/ 28 июня 2019

Ленивый путь:

конфиг / application.rb

module YourApp
  class Application < Rails::Application
    def things
      @things ||= Thing.all 
    end
  end
end

Rails.application.things.detect { |thing| thing.name == "Cool Name" }

Обратите внимание, что ваши ассоциации будут по-прежнему загружаться из базы данных.

0 голосов
/ 29 июня 2019

Официальные документы по rails предоставляют подробную информацию о низкоуровневом кэшировании , которое звучит так, как будто оно может работать

Вы можете установить имя статического ключа и длительный срок действия

0 голосов
/ 28 июня 2019

Если у вас в таблице продуктов только так мало строк, вам не нужно сильно беспокоиться о том, чтобы попасть в БД, чтобы получить их.Есть много способов избежать ненужных запросов к базе данных, но мы не можем рекомендовать вам не использовать БД для этой модели, не зная отношений и того, как они могут использоваться в вашем приложении.Если вам не нужна реляционная модель данных или mvc для продуктов, тогда вы можете использовать постоянный массив и, как Макс упомянул в комментариях, вы можете использовать методы Enumerable для обычного массива, такие как:

PRODUCTS ||= [
  [name: 'tennis_balls', description: 'you need em'],
  [name: 'racquets', description: 'have at least one'],
  [name: 'sneakers', description: 'run fast with these']
].freeze

class Product
  def self.by_name(name)
    PRODUCTS.flatten.find{|a| a[:name] == name.to_s}
  end

  def self.by_names(names)
    names.map{|name| by_name(name)}.compact
  end
end

NowВы можете сделать

Product.by_name('sneakers')
# or 
Product.by_name(:sneakers)

Или массив имен:

Product.by_names([:racquets, :sneakers])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...