这有几个阶段,因为我对铁路相对较新,所以我不确定我是否以最佳方式接近它。
用户关注公司,公司应用程序在某些日子打开和关闭。如果用户跟随公司,我希望他们在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
这是解决此问题的可行方法吗?特别是我对模型中的编码不是很熟悉。
非常感谢您提供的任何帮助。
答案 0 :(得分: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
字段的情况,可能需要更改这些时间范围。)
但还有另一个问题:如果由于某种原因(计算机崩溃,代码错误等)您的预定程序在某一天没有运行会发生什么?您需要一种方法来确保即使出现问题也会最终发送通知。有两种解决方案:
ARGV
)请注意,范围不是必需的。你可以这样做:
Firm.where(:open_date => (Date.today .. Date.today+1)).each do |firm|
#...
end
但范围至少包含了识别各种记录集的细节。