2012-04-10 10 views
1

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

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

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

私の考えでは、ニュースレターを送信し、毎月、毎週などのサブクラスを作成してルビのオブジェクト指向性を利用するための基本クラスを作成する方法があります。しかし、これが問題を解決する最善の方法であるかどうかはわかりません。

この問題を解決できる方法が他にあるかどうかを知りたかったのです。私は解決のためにレールのルビーを必要としません、他のプログラミング言語でこの問題を解決する経験を持っている人は役に立ちます。

答えて

1

これは設計上の問題であり、スケジューリング動作を複数のクラスに分割するのが面倒になるかどうかにまで下がります。大文字小文字のステートメントは避けられます。これは、多型が使用されている可能性があることを示しています。

しかし、別のクラスを使用することを選択した場合、これはタイプフィールドのActiveRecord実装に適しています。各加入者はスケジュールに属します。 (私はスケジュールに1人の加入者がいることをお勧めします)

スケジュール表には、クラスの名前を持つタイプフィールドがあります。タイプを設定する必要はありません。代わりに、スケジュールを格納するには、加入者オブジェクトからの関連付けを使用してスケジュールオブジェクトを作成し、ActiveRecordがタイプフィールドを設定します。

これで、データベースからスケジュールオブジェクトを取得するたびに、タイプフィールドで指定されたクラスになります。曜日のクラス、月の日付のクラス、および異なる日付計算の振る舞いと同じくらい多くの異なるクラスをクラスに含めることができます。

次回の電子メールの日付を保存してください。これはスケジュールテーブルにあるはずですが、それがより便利な場合は、subscribersテーブルに置くことができます。

次の期日を計算する方法を使用します。メソッドがすべてのクラスで同じシグネチャを持つことを確認します。したがって、毎月のスケジュールでは、月の日付をテーブルに格納し、その月の日付を共通のメソッドに渡さないでください。このようにして、配信アルゴリズムは、スケジュールアルゴリズムまたはデータについて何も知らなくても、期限を更新するメソッドを呼び出すことができます。

+0

不運にも、私はモンゴイドと協力しているので、activerecordの実装は私にとってはいいものではありません。 – nightf0x

+0

と私は次の電子メールの期限を保存するポイントが表示されません。特定の曜日またはユーザの設定に基づいて特定の日にすべてのユーザに電子メールを送信する予定であるので、 – nightf0x

+0

次回の納品日を保存する値は、ニュースレターを送信するかどうかを決定するコードです。それは毎日実行される可能性があり、今日どのニュースレターを入手する必要があるのか​​、そうでないのかを簡単に判断する必要があります。 –

1

毎月/毎日/毎週のメールが、異なるクラスのメリットを得るには十分に異なるとは思われません。個人的に私がこれにアプローチする方法は、ユーザーの希望の郵送頻度を保管し、ユーザーの次の電子メール日付を保管することです。

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

+0

問題は、現在サイトにいるユーザーの数が10k +以上に増えているため、実行時に計算できるデータを格納しない方がよいと考えています。ここでは、データオーバーヘッド、コード維持、時間などの要素を使って遊んでいます。だから基本的には、データベースに追加の情報を格納することなく、多くの条件なしでコードを読みやすくしておきたい。 – nightf0x

+0

100万人のユーザーがいるとします。あなたがやりたい最後のことは、それらのユーザーをすべて読み込んで、ルビーコードを評価して、今日彼らがメールを受け取ってメールするかどうかを判断することです。一方、索引付き列の値でユーザーを選択すると高速になります。明らかにあなたまで。 –

+0

提供されたソリューションは良好です。しかし、私は、ユーザーの設定を保存しているので、次の日付を送信することはオーバーヘッド情報になると思います。だから私は彼らが保存した設定に基づいてユーザーを読み込むことができます。 – nightf0x

関連する問題