2013-09-18 5 views
0

У меня есть список записей в Rails, и у этих записей есть логическое поле, чтобы сделать их общедоступными или частными. Мне нужно изменить каждый публичный отчет на приватный всякий раз, когда updated_at> = 30 дней назад.Как обновить запись, основанную на обновленном возрасте без обратных вызовов

Я не знаю с чего начать. Любые советы, ссылки и советы приветствуются. Спасибо!

Решение

В соответствии с рекомендациями @ lol007 я использую всегда, когда драгоценный камень. Шагами я следовать являются:

  1. Создать приложение с заголовком таблицы сообщения: содержание строки: текст статус: логический и запустить первый раз сервер, чтобы добавить информацию, то остановить сервер и продолжить с другими шагами.
  2. Добавить всякий раз, когда gem в мой gemfile и запускает пакет.
  3. Использовать при необходимости. в консоли, чтобы создать файл конфигурации/schedule.rb
  4. Добавить в моделях/post.rb следующий код:

    def self.check_updated_at 
        where('updated_at < ?', 30.minutes.ago).update_all({ :status => :true }) 
    end 
    
  5. Добавить в конфиге/schedule.rb следующий код:

    every 3.minutes do 
        runner "Post.check_updated_at" 
    end 
    
  6. Потому что им работать в разработке, я запустить следующую команду:

    $ whenever --update-crontab --set environment='development' 
    
  7. Затем, чтобы проверить мои хроны работают я запустить следующую команду:

    $ crontab -l 
    
  8. Моего последний шаг запустить сервер рельсов и заставить работать мое приложение.

Другие линии я использовал в моем тесте:

$ whenever -w 

Для создания файла хрон в производстве. И

$ crontab -r 

Чтобы удалить файл cron, когда это не тот, который я хочу.

спасибо всем за ваше время и ввод.

ответ

1

Вы можете использовать Whenever Gem. Например, в config/schedule.гь:

every 1.day, :at => '4:30 am' do 
    runner "YourModel.check_updated_at" 
end 

В модели:

def self.check_updated_at 
    where('updated_at > ?', 30.days.ago).update_all({private: true}) 
end 
+0

спасибо за ваши комментарии, я остановил эту проблему, потому что клиенту не нужно больше, но сейчас я снова хочу добавить в новый проект. Всякий раз, когда Gem работает с рубином 1.8.7 и рельсами 3.2.11? Безусловно, это моя конфигурация прямо сейчас. – Stanmx

+0

Думаю, да. «Совместимость с Ruby 1.8.7-1.9.3, JRuby и Rubinius». (c) –

+0

Я пытаюсь с каждым драгоценным камнем, но я не вижу, чтобы что-то случилось. Посмотрите мой пример: https://gist.github.com/stanmx/7310350 – Stanmx

0
YourModel.update_all({:private => true}, "updated_at > 30.days.ago") 
+0

этот код в контроллер или модели? – Stanmx

1

Вместо того, чтобы иметь поле базы данных, которая обновляет себя в зависимости от времени, вы можете добавить новый метод к вашей модели:

class Wtf< ActiveRecord::Base 
    #... 
    # like this 
    def is_public 
    updated_at> 30.days.ago 
    end 

    # or like this 
    def self.only_public 
    where("updated_at> ?", 30.days.ago) 
    end 
end 

Затем используйте его как:

Wtf.only_public.joins(:somethingelse).where("somethingelses.attribute= 42") 

или

Wtf.first.is_public 
+0

'где (" updated_at>? ", 30.days_ago)' - просто опечатка в одиночной кавычке –

+0

ваш метод 'is_public' всегда будет возвращать false. –

+0

@ lol007 отредактировал спасибо – nurettin

Смежные вопросы