1

我目前正在开发一个基于 ruby​​ on rails 的项目。该网站的一项特殊功能包括通过邮件及时发送通知,其中包含网站上发布的所有帖子的摘要。邮件的发送默认间隔为 30 天。因此,每个用户在不同的日子收到一封邮件,这取决于他的注册日期以及最后一封发送的新闻信函的日期,这是与用户相关的数据之一。

但现在我正在考虑向时事通讯添加设置,以便用户可以配置他想要获取时事通讯的时间间隔。因此,我不想根据最后一封新闻信的发送日期发送时事通讯,而是想在每月的特定日期将时事通讯发送给所有用户。

例如,如果用户希望每周接收一份时事通讯,它将在每周的每个星期日发送。每月的时事通讯将在每个月的 1 日发送,依此类推。

我想到的一种方法是创建一个用于发送时事通讯的基类,然后为每月、每周……等等创建子类,以利用 ruby​​ 的面向对象特性。但我不确定这是否是解决问题的最佳方法。

我想知道是否有其他方法可以解决这个问题。我不需要 ruby​​ on rails 解决方法,任何有使用任何其他编程语言解决此问题的经验的人都可能会有所帮助。

4

2 回答 2

1

我不觉得每月/每天/每周的电子邮件不同到足以值得不同的课程。就我个人而言,我将处理此问题的方式是存储用户所需的邮寄频率,然后存储用户的下一个电子邮件日期。

找出今天需要电子邮件的人只是在下一个电子邮件到期日期之前选择用户(如果您索引该列,这将很快)。当您发送电子邮件时,将列更新为今天 + 适当的偏移量。如果用户在那里更改偏好,则重新计算他​​们的下一个电子邮件日期。您可以通过记录每次向用户发送时事通讯(由于其他原因可能是有趣的数据)或通过在用户表上维护上一个电子邮件日期和下一个电子邮件日期来做到这一点。

于 2012-04-10T11:41:25.887 回答
1

这是一个设计问题,可能归结为将调度行为分解为多个类是否会变得更加麻烦。您将避免使用 case 语句,这表明可以使用多态性。

但是,如果您选择使用单独的类,那么现在是实现类型字段的 ActiveRecord 的好时机。每个订阅者都属于一个时间表。(我建议安排一个订阅者。)

schedules 表将有一个 type 字段,其中包含类的名称。您不必设置类型。相反,要存储计划,请使用来自订阅者对象的关联创建计划对象,ActiveRecord 将设置类型字段。

现在,每当您从数据库中获取计划对象时,它将是类型字段中指定的类。您可以为一周中的某天设置课程,为每月的日期设置不同的课程,以及与不同日期计算行为一样多的不同课程。

请存储下一个到期电子邮件日期。这应该在 schedules 表中,但如果这样更方便,您可以将它放在subscribers 表中。

使用一种方法来计算下一个到期日。确保该方法在所有类中具有相同的签名。因此,对于每月计划,将月份的日期存储在表中,不要将月份的日期传递给常用方法。这样,交付代码可以调用该方法来更新到期日期,而无需了解有关调度算法或数据的任何信息。

于 2012-04-10T12:03:31.353 回答