質問
ユーザーの電子メール設定を実装したいと考えています。rails-settings gem またはそのrails-settings-cached forkのいずれかが最適だと思いますが、よくわかりません。これを行うには rails-settings (または rails-settings-cached) gem を使用する必要がありますか、それとももっと良い方法がありますか? これらの宝石のいずれかを使用する必要がある場合は、ヒントや潜在的な落とし穴があれば大歓迎です。
私がしたいこと
マスター スイッチ - すべてのシステム メールのオン/オフ
各ユーザーには、すべてのメールをオプトアウトしたかどうかを知らせる「マスター スイッチ」があります。基本的には、「メールを送信してください」というチェックボックスになります。このボックスがオフ (false) の場合、システム メールを受信しません (パスワードのリセットを除く)。ボックスがオン (true) の場合、システム メールを受け取る資格があります。
複数のシステム メールのオプトイン/オプトアウト
マスター スイッチが「true」(電子メールに適格) の場合、次の構成は、個々のシステム電子メールのチェックボックスを提供することです (「新しいメッセージを受信しました」、「私が開始したスレッドに関する新しいコメント」)。各システム メールをオプトインまたはオプトアウトできます。
追加の配信オプションを含む一部のメールのオプトイン/オプトアウト
最後に、一部の電子メールは「概要」電子メールであり、ユーザーが電子メールを受信する資格があるかどうか、およびユーザーが受信を希望する頻度を知りたいと考えています。たとえば、アカウント アクティビティの毎日の概要です。メールのオプトイン/オプトアウトを許可し、オプトインした場合に概要を送信する曜日を教えてほしいので、「はい、月曜から金曜までこのメールを送ってください。」または、毎週の要約メール: 「はい、毎週日曜日にこのメールを送ってください。」
rails-settings gem を理解していれば、User モデルは次のようになります。
class User < ActiveRecord::Base
has_settings do |s|
s.key :email_master, :default => true
s.key :new_comment_email, :default => true
s.key :daily_recap_email, :defaults => { :send => true, :days => [0,1,2,3,4,5,6] }
# or maybe this would be easier
s.key :daily_recap_email, :defaults => { :send => true, :sunday => true, :monday => true, :tuesday => true }
s.key :weekly_recap_email, :defaults => { :send => true, :day => 0 }
end
end
次に、次のように言えます。
if user.settings.email_master && user.settings.new_comment_email
UserMailer.new_comment_email(user).deliver
end
または、daily_recap メールのより複雑なケース:
if user.settings.email_master && user.settings(:daily_recap_email).send && user.settings(:daily_recap_email).days.include?(3)
UserMailer.daily_recap_email(user).deliver
end
以前のアプリでこれを行うために行ったこと
以前、Users モデルと 1 対 1 の EmailPreferences モデルでこれを行いました。問題は、スケーリングが難しいことでした。何らかのイベントに基づいて新しいシステム メールを作成するたびに、EmailPreferences テーブルに列を追加する必要がありました。また、テーブルはほとんどがブール値であり、"in" または "out" (true または false) の設定を行うことはできましたが、それ以上のことはできなかったため、注意が必要でした。また、「このイベントの結果として、このメールをこのユーザーに送信する必要があるか」という最終的な質問にたどり着くまでにメソッドを連鎖させる必要があったため、ユーザーがメールを受信する必要があるかどうかを判断するのがかなり難しいこともわかりました。