我目前正在开发基于ruby on rails的项目。该网站的一个特点是通过邮件及时发送通知,其中包含网站上发布的所有帖子的摘要。邮件以默认间隔30天发送。因此,每个用户在其注册当天根据其注册日期以及发送的最后一封新闻信件的日期收到邮件,该日期是与用户关联的数据之一。
但现在我正在考虑向简报添加设置,以便用户可以配置他想要获取简报的时间间隔。因此,我不想根据上次发送新闻信的日期发送简报,而是希望在每个月的特定日期向所有用户发送简报。
例如,如果用户希望每周收到一份简报,则会在每周的星期天发送。每月1日发送通讯,依此类推。
我想到的一种方法是创建一个基类,用于发送新闻稿,然后创建每月,每周......的子类,以便利用ruby的面向对象。但我不确定这是否是解决问题的最佳方法。
我想知道是否还有其他方法可以解决这个问题。我不需要ruby on rails解决方案,任何有经验解决这个问题的人都可以帮忙。
答案 0 :(得分:1)
我觉得每月/每日/每周的电子邮件不同,不值得不同的课程。我个人采用的方式是存储用户所需的邮件频率,然后存储用户的下一个电子邮件日期。
找出今天需要电子邮件的人只是在下一个截止日期前选择用户(如果您将该列编入索引,则会很快)。发送电子邮件时,请将列更新为今天+适当的偏移量。如果用户更改了首选项,则重新计算其下一个电子邮件日期。您可以通过每次向用户发送简报(由于其他原因可能是有趣的数据)或通过维护用户表上的最后一个电子邮件日期以及下一个电子邮件日期来记录。
答案 1 :(得分:1)
这是一个设计问题,可能归结为将调度行为分解为多个类是否变得更加麻烦。您将避免使用case语句,这表明可以使用多态。
但是,如果您这样做,则选择使用单独的类,这是类型字段的ActiveRecord实现的好时机。每个订户都属于一个时间表。 (我建议一个时间表有一个用户。)
schedule表有一个类型字段,带有类的名称。您不必设置类型。相反,要存储计划,请使用订户对象中的关联创建计划对象,ActiveRecord将设置类型字段。
现在,无论何时从数据库中获取计划对象,它都将是类型字段中指定的类。您可以拥有星期几的课程,月份日期的不同课程,以及不同日期计算行为的不同课程。
存储下一个截止日期的电子邮件。这应该在schedule表中,但是你可以将它放在subscriber表中,如果这样更方便的话。
使用方法计算下一个截止日期。确保该方法在所有类中具有相同的签名。因此,对于月度计划,将月份日期存储在表中,并且不将月份日期传递给公共方法。这样,传递代码可以调用方法来更新截止日期,而无需了解有关调度算法或数据的任何信息。