1

現在、Ruby on Rails に基づくプロジェクトに取り組んでいます。ウェブサイトの特定の機能には、ウェブサイトに投稿されたすべての投稿の要約を含むメールによるタイムリーな通知の送信が含まれます。メールはデフォルトの 30 日の間隔で送信されました。したがって、各ユーザーは、登録日と、ユーザーに関連付けられたデータの 1 つである最後のニュース レターの日付に基づいて、異なる日にメールを受信しました。

しかし今、ユーザーがニュースレターを受け取りたい間隔を設定できるように、ニュースレターに設定を追加することを考えています。そのため、最後のニュース レターが送信された日付に基づいてニュースレターを送信する代わりに、月の特定の日にすべてのユーザーにニュースレターを送信したいと考えています。

たとえば、ユーザーが毎週ニュースレターを受け取りたい場合、毎週日曜日に送信されます。毎月の場合、ニュースレターは毎月 1 日に送信されます。

私が思いついたアプローチの 1 つは、ニュースレターを送信するための基本クラスを作成し、次に月次、週次などのサブクラスを作成して、Ruby のオブジェクト指向性を利用することです。しかし、これが問題の解決を進める最善の方法であるかどうかはわかりません。

この問題を解決できる他の方法があるかどうか知りたかったのです。ruby on rails の解決方法は必要ありません。他のプログラミング言語でこの問題を解決した経験がある人なら誰でも助けてくれるでしょう。

4

2 に答える 2

1

これは設計上の問題であり、スケジューリング動作を複数のクラスに分割することがより面倒になるかどうかに帰着する可能性があります。ポリモーフィズムが使用された可能性があることを示す case ステートメントを回避します。

ただし、別のクラスを使用することを選択した場合は、これが type フィールドの ActiveRecord 実装の良い機会です。各サブスクライバはスケジュールに属します。(スケジュールにはサブスクライバーが 1 つあることをお勧めします。)

スケジュール テーブルには、クラスの名前を含む type フィールドがあります。タイプを設定する必要はありません。代わりに、スケジュールを保存するために、サブスクライバー オブジェクトからの関連付けを使用してスケジュール オブジェクトを作成すると、ActiveRecord によって type フィールドが設定されます。

これで、データベースからスケジュール オブジェクトを取得するたびに、type フィールドで指定されたクラスになります。曜日のクラス、月の日付の別のクラス、および異なる日付計算動作と同じ数の異なるクラスを持つことができます。

次回の電子メールの期日を保存してください。これはスケジュール テーブルにある必要がありますが、より便利な場合は、サブスクライバー テーブルに配置することもできます。

次の期日を計算するメソッドを使用します。メソッドがすべてのクラスで同じ署名を持っていることを確認してください。そのため、月間スケジュールの場合は月の日付をテーブルに格納し、月の日付を共通メソッドに渡さないでください。そうすれば、配送コードは、スケジュール アルゴリズムやデータについて何も知らなくても、メソッドを呼び出して期日を更新できます。

于 2012-04-10T12:03:31.353 に答える
1

毎月/毎日/毎週のメールが異なるクラスに値するほど異なるとは思えません。個人的にこれにアプローチする方法は、ユーザーの希望するメール頻度を保存してから、ユーザーの次の電子メールの日付を保存することです。

今日電子メールが必要な人を見つけることは、次の電子メールの期日までにユーザーを選択することです (その列にインデックスを付ければ、高速になります)。メールを送信するときは、列を今日 + 適切なオフセットになるように更新します。ユーザーが設定を変更した場合は、次の電子メールの日付を再計算します。これを行うには、ユーザーにニュースレターを送信するたびに記録するか (他の理由で興味深いデータになる可能性があります)、ユーザー テーブルで最後の電子メールの日付と次の電子メールの日付を維持します。

于 2012-04-10T11:41:25.887 に答える