Комментировать уведомления пользователей в рельсах? - PullRequest
1 голос
/ 27 июня 2009

В моем веб-приложении есть зарегистрированные пользователи, а также статьи, посты в блогах и сплетни. Для всех этих ресурсов у меня есть полиморфная модель комментариев, которая приведена ниже.

id  content         commentable_id  commentable_type   user_id  created_at  updated_at
1   Frist comment   2               Article            1        ....
2   Second comment  3               Post               2        .....

Так что для каждого комментируемого ресурса у меня есть форма комментария внизу комментируемого ресурса, чтобы пользователи могли комментировать. Я хочу установить флажок, чтобы при отправке комментария пользователи получали уведомление, будь то в папке «Входящие» или по электронной почте, поскольку оно уже есть при регистрации пользователя, когда другие новые комментарии добавляются позже.

Я хочу, чтобы у меня была какая-то модель, например Уведомления, где я мог бы хранить commentable_type, commentable_id и user_id (кому следует отправлять уведомление, если есть какой-либо новый комментарий, созданный с совпадающими комментарием и пользователем?

Как я могу реализовать связь между Комментарием и Уведомлением? Для проверяющей части, если есть какая-либо подписка на конкретный комментируемый ресурс, создайте CommentObserver с ловушкой after_create, чтобы инициализировать поиск и отправлять уведомления, если есть какая-либо соответствующая запись.

Но я не понимаю, как будут выглядеть ассоциация, модель, контроллер и представления для достижения этой цели? Поскольку модель комментариев уже полиморфна, могу ли я создать модель уведомлений как полиморфную ??

Ответы [ 2 ]

6 голосов
/ 27 июня 2009

Вы можете легко сделать это без плагина. Создайте таблицу базы данных для хранения подписок на уведомления пользователей. Затем каждый раз, когда вы создаете комментарий, запрашиваете базу данных и отправляете электронное письмо с помощью ActionMailer на адрес всех пользователей.

1 голос
/ 16 декабря 2014

Первый шаг - создание новой модели и контроллера для уведомления

   $ rails g model Notification  post:references comment:references user:references read:boolean

   $ rake db:migrate
   $ rails g controller Notifications index

Как только это будет сделано, следующим шагом будет добавление has_many: уведомлений для моделей User, Post и Comment.

Как только это будет сделано, добавьте следующий код в модель комментариев:

       after_create :create_notification

       private

         def create_notification
           @post = Post.find_by(self.post_id)
           @user = User.find_by(@post.user_id).id
             Notification.create(
             post_id: self.post_id,
            user_id: @user,
             comment_id: self,
             read: false
              )
        end

Приведенный выше фрагмент кода создает уведомление после создания комментария. Следующим шагом является редактирование контроллера уведомлений, чтобы уведомление могло быть удалено, а пользователь мог пометить уведомление как прочитанное:

       def index
         @notifications = current_user.notications
         @notifications.each do |notification|
         notification.update_attribute(:checked, true)
      end
     end

      def destroy
        @notification = Notification.find(params[:id])
        @notification.destroy
        redirect_to :back
      end

Далее необходимо настроить способ удаления уведомления при удалении комментария:

          def destroy
           @comment = Comment.find(params[:id])
           @notification = Notification.where(:comment_id => @comment.id)
             if @notification.nil?
               @notification.destroy
             end
           @comment.destroy
           redirect_to :back
        end

Последнее, что нужно сделать, это создать несколько представлений. Вы можете делать все, что захотите

...