Кэширование страниц, лучшая практика по автоматическим истекающим / подметальные машины - PullRequest
2 голосов
/ 14 декабря 2009

До сих пор я никогда не вникал в удивительные методы кэширования, которые предоставляет Rails. Одна вещь, которую я действительно не могу обернуть вокруг себя, это как решить эту конкретную проблему.

Учитывая, что у меня есть модель блога с большим количеством сообщений:

class Blog < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  named_scope :published, :conditions => ["published_at < ?", Time.now]
end

И действие show в BlogsController показывает список опубликованных сообщений:

// BlogsController

def show
 @blog = Blog.find(params[:id)
end

// View

<% @blog.posts.published.each do |p| %>
 <h2><%=h p.title %></h2>
 <%= simple_format(p.content) %>
<% end %>

Срок действия кэша должен истечь, когда будет выполнено какое-либо изменение атрибута publ_at, НО это также необходимо сделать, когда в будущем будет опубликовано значение updated_at и достигнуто это время.

Ребята, можете ли вы дать мне несколько идей и указаний о том, как лучше всего решить эту проблему? Крон-работа или я схожу с ума?

Ответы [ 2 ]

5 голосов
/ 14 декабря 2009

Код, который вы показываете, не использует никаких функций кэширования Rails. Однако ваша :published именованная область будет использовать (и, на практике, запоминать через кэширование классов) Time.now при первом выполнении этого кода.

Я подозреваю, что вы хотите это вместо:

named_scope :published, lambda { { :conditions => ["published_at < ?", Time.now] } }

Лямбда гарантирует, что Rails каждый раз пересматривает ваше состояние.

1 голос
/ 14 декабря 2009

Все зависит от типа хранилища данных, которое вы используете для хранения кэша.

Если вы используете файловую систему, вы можете написать задание cron для аннулирования кэша через определенный интервал или закодировать дату и время, в течение которого кэш действителен до момента его использования, и проверять это при каждом запросе и аннулировать при необходимости. 1003 *

В качестве альтернативы, если вы используете бэкэнд, если memcached, вы можете использовать истекающий кеш, что, вероятно, является лучшим решением.

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