0

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

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

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

модель firms.rb

def application_status 
    if open_date == Today.date 
     self.opening = true 
    else 
     self.opening = false 
    end 

    if ((close_day - Today.date) == 7) 
    self.warning = true 
     else 
    self.warning = false 
    end 

    if close_day == Today.date 
    self.closing = true 
     else 
    self.closing = false 
    end 
end 

Я хотел бы этот метод будет называться на каждой фирмы один раз в день, так что каждая фирма имеет соответствующий объем - поэтому я попытался использовать всегда, когда драгоценный камень (CRON) и следующий код. Выполнение вышеуказанного модельного метода для каждой фирмы.

Schedule.rb

every 1.day do 
runner "Firm.all.each do |firm| 
    firm.application_status 
end" 
end 

Тогда для каждого открытия прицелов, предупреждение, закрытия у меня есть метод в файле когда это графики, для простоты я буду показывать только методы открытия. Следующие запросы для всех фирм, у которых была открытая область применения к ним, и запускают на них метод application_open_notification.

Schedule.rb

every 1.day do 
runner "Firm.opening.each do |firm| 
    firm.application_open_notification 
end" 
end 

Это вызывает следующий метод в модели Firm.rb

def application_open_notification 
    self.users.each do |user| 
    FirmMailer.application_open(user, self).deliver 
    end 
end 

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

def application_open(user,firm) 
    @firm = firm 
    @user = user 
    mail to: @user.email, subject: @firm' is now accepting applications' 
    end 
end 

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

Большое спасибо за любую помощь, которую вы можете предложить.

ответ

1

Я предполагаю, что opening, warning и closing являются поля базы данных, и у вас есть областей, как:

class Firm < ActiveRecord::Base 
    scope :opening, :where => { :opening => true } 
    # etc 
end 

Существует общее правило для базы данных (и, ну, все хранения): не хранить вещи, которые вы можете окуривать, если вам это не нужно.

Поскольку статус приложения может быть укоренен с даты дня и полей open_date и close_day, вы можете рассчитать их по мере необходимости, а не создавать для них дополнительные поля. Вы можете сделать это с помощью SQL и Active Record:.

scope :opening, :where { :open_date => (Date.today .. Date.today+1) } 
scope :warning, :where { :close_day => (Date.today+7 .. Date.today+8) } 
scope :closing, :where { :close_day => (Date.today .. Date.today+1) } 

(Обратите внимание, что диапазоны их выбора времени они, возможно, придется менять в зависимости от того, если вы используете date или time поля.)

Но есть еще одна проблема: что произойдет, если по какой-либо причине (сбой компьютера, ошибка кода и т. Д.) Ваша запланированная программа не запускается в определенный день? Вам нужен способ убедиться, что уведомления отправляются в конце концов, даже если что-то ломается. Есть два решения:

  1. Написать свой график программу для OPTIONALLY принять дату, кроме сегодня (через ARGV)
  2. держать флаги для каждой фирмы для того, был ли отправлен каждый вид уведомления. Они должны быть сохранены в базе данных.

Обратите внимание, что области не нужны. Вы можете сделать это:

Firm.where(:open_date => (Date.today .. Date.today+1)).each do |firm| 
    #... 
end 

но объем по крайней мере, инкапсулирует детали идентификации различных наборов записей.

+0

Я думаю, что ваша идея пропустить область видимости и создать модельные методы ALOT clean, тогда я могу просто позвонить каждому из них один раз в день. Черт возьми, это действительно отличная помощь! – RMcNairn