Rails: как ограничить количество отправляемых писем?

программирование почта ruby on rails

Ситуация такая: грубо говоря, есть взаимоотношения пользователей. Каждый из них может создать связь с другим, либо разорвать ее. При создании такой связи, и при ее разрушении должны отправляться email-уведомления (либо обеим сторонам, либо только второй стороне, пока не решил). Собственно, вопрос в том, как ограничить количество создания этих связей в единицу времени, чтобы один пользователь не тыкал на кнопку по 5 раз, что вызывало бы каждый раз отправку email-уведомлений?

Пока идея только такая: при разрыве взаимоотношений в таблице Relationships не удалять запись о созданной связи, а передавать булево значение freeze = true. Таким образом будет изменено и значение updated_at. Затем в заданный промежуток времени (каждый час) проходить кроном по таблице, отыскивать freeze-связи, смотреть на updated_at, и удалять записи из таблицы, если updated_at больше определенного срока (суток, например).

Есть ли другие варианты?

Примечание:
>> т.е. разрыв одного релейшин может породить более одного письма?
Нет, одно, тому, с кем разорвали связь.

>> не должно быть такого чтобы каждое нажатие на кнопку вызывало отправку письма - плохой код
В смысле? Суть такая: есть Помощники, есть Новички - две группы пользователей. Новички могут попросить помощи (через нажатие кнопки на странице Помощника), соответственно Помощнику приходит уведомление. Если Новичок отказывается от помощи, также нажимает кнопку, снова приходит уведомление Помощнику об отказе. Аналогично и в обратную сторону (Помощники предлагаю помощь Новичкам, те могут отказаться или принять, в любом случае уведомление приходит второй стороне). Так что в этом нелогичного и почему плохой код?

>> непрогнозируемые по времени операции, например те что зависят от работоспособности почтовых серверов, нужно всегда выносить из приложения
>> delayed_jobs попробуйте у нас 10к facebook_request в сутки обрабатывается этим методом
Никогда не работал с подобным, Рельсы только начал изучать.

Примечание:
И, да, забыл сказать. Дело ведь не только в уведомлениях, посылаемых пользователям. Просто нужна защита от постоянных нажатий на кнопку. Собственно, описанный в самом вопросе метод я уже реализовал.

Примечание:
>> крон через script\delayed_jobs поднимает eviroinment и делает всю работу медленную и/или не срочную работу
Ну так письма то желательно доставлять сразу.

Примечание:
>> А если сделать ход конём и реализовать подтверждение релейшена тем пользователем с которым его пытаются установить. и пока подтверждение на установление релейшена не получено пользователь не сможет делать повторных запросов.
Весьма смутное предложение. То есть Вы действительно считаете, что лучше поступить в данном случае по методу вконтактика? Новичок будет просить Помощника о помощи (нажатием кнопки), но отказаться от помощи уже не сможет до тех пор, пока Помощник не согласится помочь (нажатием соответствующей кнопки)? По-моему, бред. Я уже реализовал так, что пользователь может запросить помощь, может от нее отказаться, тогда происходит переход взаимоотношений в статус freeze, и отношения удаляются только через неделю. То есть повторно запрос раньше этого времени сделать нельзя.

>> в больших системах часто реализуют очередь сообщений, а не отсылают сообщение сразу
учту, но пока приложение рассчитано на небольшое количество посетителей, а уж тем более потенциальных пользователей.

>> тогда переформулируйте задачу, ничегонепонятно
да что ж тут не понятно то? В первом дополнении расписано все до мелочей.

Спасибо всем за предложения, но все же реализовал свой вариант, другие не совсем подходят.
Ответы:
т.е. разрыв одного релейшин может породить более одного письма?
может лучше сделать метод вызываемый after_destroy или по If user.relation.destroy? не в контроллере а в объекте
или если в контроллере то через transaction do чтобы stalled объектов не было
не должно быть такого чтобы каждое нажатие на кнопку вызывало отправку письма - плохой код
delayed_jobs - плагин
крон через script\delayed_jobs поднимает eviroinment и делает всю работу медленную и/или не срочную работу
А если сделать ход конём и реализовать подтверждение релейшена тем пользователем с которым его пытаются установить. и пока подтверждение на установление релейшена не получено пользователь не сможет делать повторных запросов.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.