Задать вопрос
beerdy
@beerdy
https://vk.com/beerdy

Кэширование по книге RoR. Поможете разобраться?

Помогите пожалуйста разобраться вот в этом коде
<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>

<h1>Your Pragmatic Catalog</h1>

<% cache ['store', Product.latest] do %>
  <% @products.each do |product| %>
    <% cache ['entry', product] do %>
      <div class="entry">
        <%= image_tag(product.image_url) %>
        <h3><%= product.title %></h3>
        <%= sanitize(product.description) %>
        <div class="price_line">
          <span class="price"><%= number_to_currency(product.price) %></span>
<!-- START_HIGHLIGHT -->
          <%= button_to 'Add to Cart', line_items_path(product_id: product) %>
<!-- END_HIGHLIGHT -->
        </div>
      </div>
    <% end %>
  <% end %>
<% end %>

По книге вообще ничего непонял, что и на каком этапе кэшируется?
И вот это что за код:
def self.latest
		Product.order(:updated_at).last
	end
  • Вопрос задан
  • 350 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Здесь кэшируются фрагменты для каждого отдельного продукта и фрагмент для всего списка продуктов.
def self.latest
  Product.order(:updated_at).last
end

- возвращает последний измененный продукт (выборка по дате обновления).

Фрагмент для отдельного продукта, инвалидируется при изменении product:
<% cache ['entry', product] do %>
  ...
<% end %>

Фрагмент для всего списка:
<% cache ['store', Product.latest] do %>
  ...
<% end %>

инвалидируется при изменении Product.latest, то есть по сути при изменении любого продукта.

При повторном обращении к коду проверяется последнее изменении продукта (Product.latest). Если изменений после кэширования не было, полный список берется из кэша. Если были - рендерится заново, при этом в цикле проверяются изменения каждого продукта и при их отсутствии фрагмент для него берется из кеша.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Able1991
@Able1991
Пишу на рельсах
Кешировать erb особо смысла нету, посмотрите сами время рендеринга вьюхи - у вас обращенеи к cache store будет не быстрее. Кешируйте данные в контроллере.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы