Rails запрашивает список для работы CRON - PullRequest
1 голос
/ 04 марта 2020

Я новичок в работе с CRON, но я думаю, что я правильно его настроил.

В конечном итоге я пытаюсь отправлять пользователям по электронной почте каждый день в 8:00 ( и пару других), которые не вошли в систему в течение последних 3 дней, не получили электронное письмо и помечены как активные ИЛИ временные как статус.

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

  • first = User.where (статус: 'active'). или (User.where (status: 'temp'))
  • second = first.where ( "last_login_at <?", Time.now-3.days) </li>
  • third = second.where (уведомлено: false)

Это не совсем понятно, но я пытался найти содержащий запрос, который захватил все эти данные. Есть ли более чистый способ выполнить этот запрос?

Я считаю, что моя задача cron правильно настроена с использованием бегуна. У меня есть всякий раз, когда установлен и в моем schedule.rb у меня есть:

every 1.day, at: '8:00 am' do
 runner 'ReminderMailer.agent_mailer.deliver'
end

Так под app> mailer я создал ReminderMailer

class ReminderMailer < ApplicationMailer
 helper ReminderHelper

 def agent_reminder(user)
  @user = user
  mail(to: email_recipients(user), subject: 'This is your reminder')
 end

 def email_recipients(agent)
  email_address = ''
  email_addresses += agent.notification_emails + ',' if agent.notification_emails
  email_addresses += agent.manager
  email_address += agent.email
 end
end

Где я на самом деле борюсь, это где я должен поставить мои запросы для отправки в почтовую программу, именно поэтому я создал ReminderHelper.

module ReminderHelper

 def applicable_agents(user)
  agent = []
  first = User.where(status: 'active').or(User.where(status: 'temp'))
  second = first.where("last_login_at < ? ", Time.now-3.days)
  third = second.where(notified: false)
  agent << third
  return agent
 end
end

РЕДАКТИРОВАТЬ: Итак, я знаю, что теоретически я могу сделать цепочку запросов. Должен быть лучший путь, верно?

Так что мне нужна помощь: у меня есть правильная структура на месте? Есть ли более чистый способ запросить эти данные в ActiveRecord для задания CRON? Есть ли способ проверить это?

1 Ответ

0 голосов
/ 04 марта 2020

Попробуйте объединить их вместе, как будто понимаете правильные условия

  • Не входили в систему в течение последних 3 дней,
  • Не получили письмо
  • Есть помечен как активный ИЛИ временный как статус
User.where("last_login_at < ? ", 3.days.ago).
     where(notified: false).
     where(status: ['active', temp])

module ReminderHelper
 def applicable_agents(user)
   User.where("last_login_at < ? ", 3.days.ago).
     where(notified: false).
     where(status: ['active', temp])
 end
end

Вам не нужно добавлять / присваивать их массиву. Потому что это отношение уже похоже на массив. Вы можете использовать .to_a, если вам нужен массив. Если вы просто хотите перебрать их, то users.each должно работать нормально.

Обновление

class User

    scope :not_notified, -> { where(notified: false) }
    scope :active_or_temp, -> { where(status: ['active', 'temmp']) }
    scope :last_login_in, -> (default_days = 3) { where("last_login_at < ?", default_days.days.ago) }

end

и затем использовать

    User.not_notified.active_or_temp.last_login_in(3)

Вместо Time.now-3.days лучше использовать 3.days.ago, поскольку он также учитывает часовой пояс и позволяет избежать ненужных проблем и неудачных тестовых случаев.

Кроме того, вы можете создавать небольшие небольшие области и комбинировать их. Подробнее читайте в областях применения https://guides.rubyonrails.org/active_record_querying.html

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