4

В моем приложении rails у меня есть модель работы, в которой я хочу, чтобы статус автоматически менялся на «архивированный» после 30 дней с момента утверждения администратором, возможно ли это? если да, то каков способ сделать это?Автоматическое изменение статуса почты Rails

+2

Вам нужно сделать rake task – Cyzanfar

+0

Я голосовал, чтобы закрыть этот вопрос, потому что я считаю, что он слишком широк для SO. Однако, если вы посмотрите на [Руководство по Rails для активного задания] (http://guides.rubyonrails.org/active_job_basics.html), вы можете получить некоторые идеи. –

+0

@Cyzanfar Итак, если я создам задачу, она будет запущена автоматически или я должен запускать ее каждый день, извините за этот вопрос, но я никогда не работал с задачами – rocki

ответ

1

Я бы добавил атрибут с именем «archive_time» в качестве даты и времени, когда он войдет в утвержденное состояние. Затем вы можете настроить задачу рейка, чтобы установить архивированное состояние и где archive_time находится в прошлом. Это может выглядеть так:

jobs = Job.where("state = ? and archive_time >= ?", 'approved', Time.now) 
jobs.each {|job| job.archive } 

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

+0

Кроме того, драгоценный камень «всякий раз» - это хороший способ управлять рельсами cron jobs , –

1

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

Например, если у вас есть столбец с именем approved_at, который является datetime. Когда вы одобряете задание, вы устанавливаете approved_at = Time.now.

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

def is_archived? 
    approved_at && approved_at < Time.now - 30.days 
end 

И получить все архивные работы, вы можете создать область:

scope :archived, -> { where('approved_at IS NOT NULL AND approved_at <?', Time.now - 30.days)} 
+0

Привет, это частично работает, но у меня все еще есть проблема: у меня есть столбец с именем jobstatus в таблице заданий, и я хочу, чтобы меня заменили на «архивированные», когда Задание заархивировано. – rocki

+0

С тем, что я предложил, вам не понадобится 'job_status' (то есть, если у вас есть только 3 состояния: не одобрены, одобрены и заархивированы) – AbM

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