Как изменить переменную каждые несколько минут в рельсах? - PullRequest
2 голосов
/ 03 марта 2011

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

Как мне поступить с этим в рельсах?

Прямо сейчас я смотрю в направлении cronjobs, а также драгоценного камня всякий раз, когда ... но я не уверен на 100%, что мне действительно нужно все это для того, что кажется довольно простым действием?

Ответы [ 4 ]

1 голос
/ 03 марта 2011

Используйте механизм Rails.cache.

В вашем контроллере:

@record = Rails.cache("cached_record", :expires_in => 5.minutes) do
  Model.first( :offset =>rand(Model.count))
end

Во время первого выполнения, результат кэшируется в кеш Rails. Новая случайная запись восстанавливается через 5 минут.

1 голос
/ 03 марта 2011

В моей модели будет дата expiry_date, а затем пользователь получит таймер JavaScript.По истечении этого времени я отправляю запрос обратно на сервер (возможно, ajax или, возможно, обновляю страницу) и проверяю, действительно ли время истекло.Если это так, я бы представил новую запись.

0 голосов
/ 03 марта 2011

Моим первым делом было кеширование записи в глобальном масштабе, но вы можете получить разные записи, обслуживаемые разными серверами. Как насчет добавления столбца date_at дата / время в вашу запись ...

class Model < AR::Base

  def self.random
    @@random = first(:conditions => 'chosen_at NOT NULL')
    return @@random unless @@random.nil? or @@random.chosen_at < 5.minutes.ago
    @@random.update_attribute(:chosen_at,nil) if @@random
    ids = connection.select_all("SELECT id FROM things")
    @@random = find(ids[rand(ids.length)]["id"].to_i)
  end

end
0 голосов
/ 03 марта 2011

Вы можете просто проверить текущее время в вашем контроллере, например:

def show
  @last_refresh ||= DateTime.now
  @current ||= MyModel.get_random
  @current = MyModel.get_random if (DateTime.now - @last_refresh) > 5.minutes
end

Этот код не будет масштабироваться для большего количества серверов (так как он зависит от переменных класса для хранения данных), поэтомув действительности вы не хотели бы хранить две переменные класса в чем-то вроде Redis (или даже Memcache) - это для высокой производительности.Действительно зависит от того, насколько точно вам это нужно и сколько производительности вам нужно.Вы также можете использовать свою обычную базу данных для хранения времени истечения, а затем загрузить запись, текущее время которой.

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