Я вижу sql запросы для извлечения сообщений, даже если они кэшируют данные - PullRequest
0 голосов
/ 22 сентября 2018

Когда я выполняю следующий вызов в действии моего контроллера, я вижу, что в первый раз, когда я загружаю страницу, я вижу вывод "posts удара по дб" в выводе консоли.

cache_key = "posts"
@posts = Rails.cache.fetch(cache_key, expires_in: 5.minutes) do
  puts "posts hitting the db"
  Post.include(:tags).where("post_status = 1").order("id desc")
end

Если я перезагружаюсьна странице, я не вижу сообщения "posts удара по БД", но я все еще вижу запросы вроде:

Обработка PostsController # index как HTML-рендеринга posts / index.html.erb внутриlayouts / main Загрузить пост (0.5ms) ВЫБЕРИТЕ "posts". * FROM "posts" ГДЕ (post_status = 1) ЗАКАЗАТЬ ПО id desc ↳ app / views / posts / index.html.erb: 6 Загрузка метки (0.3ms) SELECT"tags". * FROM "теги" WHERE "теги". "id" = $ 1 [["id", 7]] ↳ app / views / posts / index.html.erb: 6 Отображение posts / index.html.erbв макетах / сообщениях (31,4 мс) Выполнено 200 OK за 87 мс (Просмотров: 62,6 мс | ActiveRecord: 8,2 мс)

Это потому, что он кэширует @posts, но поскольку объект @posts не был 'Т на самом деле использовал это даже не сделать вызов БД?Поэтому, когда страница просмотра выполняет @ posts.each, тогда она попадает в базу данных?

Например, если я удаляю все мои html на странице просмотра, она вообще не попадает в базу данных.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Как сказал @bkimble, вам нужно добавить .all, чтобы превратить ваш запрос в вызов базы данных.Однако, начиная с Rails 4, .all выполняется лениво.Как я объяснил в этом руководстве Memcache для Rails , вам необходимо принудительно выполнить его, например, добавив .to_a, который преобразует результат в массив.

Ваш код будет выглядеть следующим образом:

cache_key = "posts"
@posts = Rails.cache.fetch(cache_key, expires_in: 5.minutes) do
  puts "posts hitting the db"
  Post.include(:tags).where("post_status = 1").order("id desc").all.to_a
end
0 голосов
/ 23 сентября 2018

Когда вы делаете

Post.include(:tags).where("post_status = 1").order("id desc")

Вы на самом деле не вызываете базу данных.Вы создаете область ActiveRecord - это то, что вы кешируете.Если вы хотите кэшировать результаты вызова базы данных, вам нужно сделать что-то вроде:

cache_key = "posts"
@posts = Rails.cache.fetch(cache_key, expires_in: 5.minutes) do
  puts "posts hitting the db"
  Post.include(:tags).where("post_status = 1").order("id desc").all.to_a
end

Вместо этого, что заставляет ActiveRecord фактически заполнять @posts данными таблицы.

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