0

这有几个阶段,由于我对 Rails 比较陌生,我不确定我是否以最好的方式处理这个问题。

用户关注公司,公司应用程序在特定日期打开和关闭。如果用户关注一家公司,我希望他们在以下情况下自动收到电子邮件:a) 公司申请打开,b) 公司申请关闭前一周,c) 公司申请关闭当天。

我尝试过使用命名范围。我有以下模型方法(我认为这需要一些工作)设置每个公司的范围,具体取决于日期。

示范公司.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

我希望每天对每个公司调用一次此方法,以便每个公司都有适当的范围 - 所以我尝试使用when gem(cron)和以下代码。在每个公司上运行上述模型方法。

时间表.rb

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

然后对于每个范围的打开、警告、关闭,我在无论何时调度文件中都有一个方法,为简单起见,我将只显示打开方法。以下查询已应用开放范围的所有公司,并对其运行 application_open_notification 方法。

时间表.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

这是解决这个问题的可行方法吗?特别是我对模型中的编码不是很熟悉。

非常感谢您提供的任何帮助。

4

1 回答 1

1

我猜opening,warningclosing是数据库字段,并且您的范围如下:

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) }

(请注意,这些选择时间范围。它们可能必须根据您是否使用datetime字段进行更改。)

但是还有另一个问题:如果由于某种原因(计算机崩溃、代码错误等)您的计划程序没有在特定日期运行,会发生什么?即使出现问题,您也需要一种确保最终发送通知的方法。有两种解决方案:

  1. 编写您的日程安排程序以选择性地接受今天以外的日期(通过ARGV
  2. 为每家公司保留是否已发送每种通知的标志。这些必须存储在数据库中。

请注意,范围不是必需的。你可以这样做:

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

但范围至少包含了识别各种记录集的细节。

于 2012-04-11T01:24:10.930 回答