自定义模型方法,设置自动发送邮件的范围

时间:2012-04-10 20:29:35

标签: ruby-on-rails ruby-on-rails-3 actionmailer named-scope rails-models

这有几个阶段,因为我对铁路相对较新,所以我不确定我是否以最佳方式接近它。

用户关注公司,公司应用程序在某些日子打开和关闭。如果用户跟随公司,我希望他们在a)公司申请开通时自动收到电子邮件,b)公司申请结束前一周,c)公司申请结束的那天。

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

model firm.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)和下面的代码。在每家公司运行上述模型方法。

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 个答案:

答案 0 :(得分:1)

我猜我会openingwarningclosing是数据库字段,你有以下范围:

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

数据库(以及所有存储空间)有一般规则:如果不需要,请不要存储可以计算的内容。

由于应用程序的状态可以从当天的日期以及open_dateclose_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. 为每个公司保留标志,告知是否已发送了各种通知。这些必须存储在数据库中。
  3. 请注意,范围不是必需的。你可以这样做:

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

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