Настройки электронной почты пользователя - думать об использовании драгоценного камня rails-settings. Я делаю это правильно?
Вопрос
Я хочу реализовать настройки электронной почты для моих пользователей. Я думаю, что или гем rails-settings или его кэшированная вилка rails-settings- way - это путь, но я не совсем уверен. Должен ли я использовать гем rails-settings (или rails-settings-cached) для этого или есть лучший способ? Если я буду использовать один из этих драгоценных камней, любые советы или потенциальные ошибки очень приветствуются.
Что я хочу сделать
Главный выключатель - все системные письма включены или выключены
У каждого пользователя есть "главный переключатель", который сообщает мне, отказались ли они от всех электронных писем. По сути, это будет флажок "Отправлять мне письма". Если флажок снят (false), они никогда не получат системные электронные письма (кроме сброса пароля). Если флажок установлен (true), они могут получать системные электронные письма.
Отказаться от нескольких системных писем
Если главный переключатель имеет значение "true" (подходит для электронных писем), следующая конфигурация состоит в том, что я предлагаю флажки для отдельных системных электронных писем ("Новое сообщение получено", "Новый комментарий в теме, которую я начал"). Они могут подписаться на каждую системную электронную почту.
Отказаться от некоторых электронных писем с дополнительными вариантами доставки
Наконец, некоторые электронные письма будут "краткими", и я хочу знать, имеет ли пользователь право получать электронную почту и как часто он хочет ее получать. Например, ежедневная сводка активности аккаунта. Я хочу разрешить им принимать / отклонять электронные письма и сообщать мне, в какие дни недели отправлять резюме, если они согласны. Поэтому "Да, отправьте мне это электронное письмо с понедельника по пятницу". Или еженедельное резюме по электронной почте: "Да, отправляйте мне это письмо каждое воскресенье".
Если я понимаю гем rails-settings, то моя модель 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
Что я сделал для этого в предыдущем приложении
Раньше я делал это с моделью EmailPreferences, которая была 1-к-1 с моей моделью Users. Проблема заключалась в том, что масштабировать его было сложно - каждый раз, когда я создавал новое системное электронное письмо на основе какого-либо события, мне приходилось добавлять столбец в мою таблицу EmailPreferences. Это также было сложно, потому что таблица в основном была логической, так что я мог иметь настройку "in" или "out" (true или false), но не намного. Я также обнаружил, что довольно сложно выяснить, должен ли пользователь получать электронное письмо, потому что мне приходилось связывать методы, чтобы получить окончательный вопрос: "Должен ли я отправить это электронное письмо этому пользователю в результате этого события?"