Rails - Mailboxer: удалить из базы данных, если оба участника удалили беседу

Я пытаюсь удалить беседу с драгоценным камнем MailBoxer. В сам драгоценный камень ничего не включено, но я думаю, что можно сделать что-то вроде:

Если оба участника удалили беседу, удалите ее из базы данных.

Я начал с чего-то подобного в своей функции «empty_trash», поэтому каждый раз, когда участник нажимает ссылку «Очистить корзину», он проверяет, был ли разговор удален обоими или нет. Если нет, то ничего не происходит, если да, то разговор удаляется из БД.

def empty_trash
    @conversations = current_user.mailbox.conversations
        @conversations.each do |conversation|
            conversation.receipts_for(current_user).update_all(deleted: true)
        end
    @delete_conversation = Mailboxer::Receipt.select(:notification_id,:deleted).
                                         group(:notification_id,:deleted).
                                         having("count(*) > 1")
    @delete_conversation.destroy_all
    redirect_to :back
end

Итак, в основном, что я пытаюсь сделать, это сгруппировать все разговоры по :notification_id, где удалено: true, а затем удалить соответствующий результат.

РЕДАКТИРОВАТЬ: БД

  t.string "receiver_type"
  t.integer "receiver_id"
  t.integer "notification_id", null: false
  t.boolean "is_read", default: false
  t.boolean "trashed", default: false
  t.boolean "deleted", default: false
  t.string "mailbox_type", limit: 25
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.boolean "is_delivered", default: false
  t.string "delivery_method"
  t.string "message_id"



  ID | NOTIFICATION_ID| DELETED |
  =================================
  1 | 9 | t | 
  2 | 9 | t | 
  3 | 8 | f |
  4 | 8 | t |

Таким образом, в этом примере записи с «Notification_id» 9 должны быть уничтожены.

РЕДАКТИРОВАТЬ 2. После того, как вы обновили свой ответ: я закончил с этим, который работает, я просто не знаю, является ли это более чистым подходом, но, по крайней мере, он работает. Думаю позже перейду на самодельную систему обмена сообщениями, уж точно более гибкую.

def empty_trash
    @conversations = current_user.mailbox.conversations
        @conversations.each do |conversation|
            conversation.receipts_for(current_user).update_all(deleted: true)
        end

    @a = Mailboxer::Receipt.where(receiver_id: current_user.id)
    @b = Mailboxer::Receipt.where.not(receiver_id: current_user.id)

    @a.each do |a| 
    @b.each do |b|

        if a.notification_id == b.notification_id && a.deleted == true && b.deleted == true
            b.delete
            a.delete
        end

    end
    end
    redirect_to :back
end

person Jai Day    schedule 07.04.2017    source источник
comment
добавьте больше информации, пожалуйста   -  person Marcos R. Guevara    schedule 07.04.2017


Ответы (1)


Обновленный ответ

@delete_conversation = []
@conversations = Conversation.mailbox.conversations
@conversations.each do |conversation|
 @conversations.each do |compareConv|
  if conversation.notification_id == compareConv.notification_id && conversation.deleted? && compareConv.deleted && conversation.receiver_id != compareConv.receiver_id
   @delete_conversation.push(conversation)
  end
 end
end
person Marcos R. Guevara    schedule 07.04.2017
comment
Спасибо, но это будет искать все записи, которые были удалены: правда, но я хочу удалить его, только если оба участника действительно удалили его. - person Jai Day; 08.04.2017
comment
Да, извините, тогда вы можете передать for iteration внутри другого for iteration, сравнить с условным выражением и добавить в список, понимаете, что я имею в виду? if deleted_in_one? && deleted_in_two? - person Marcos R. Guevara; 08.04.2017
comment
Спасибо, у меня есть идея, но я понятия не имею, как реализовать это в моем текущем коде, не могли бы вы немного развить его? - person Jai Day; 08.04.2017
comment
все разговоры от всех пользователей, которые совпадают? также вы можете добавить два поля в уведомления, а затем, если пользователь удалит, измените это поле на true, если два поля станут истинными, тогда инициирует удаление для разговора для удаления только тогда, когда это произойдет. - person Marcos R. Guevara; 08.04.2017
comment
Ясно, но в Mailboxer у вас есть две разные записи: одна для отправки и одна для получателя, и у каждой есть поле с именем «удалено» и другое с именем «notification_id», которое является единственным, которое позволяет вам определить, является ли это одним и тем же разговором. или не. Ваш подход был бы хорош (и я сделал что-то подобное однажды), но только если бы я не использовал Mailboxer. Вы хотите, чтобы я отредактировал свой пост и добавил структуру базы данных? - person Jai Day; 08.04.2017
comment
я сделал то же самое, что вы говорите (с узлом) для собственного старого проекта, это то, что вы говорите. если можно, добавьте структуру db. - person Marcos R. Guevara; 09.04.2017
comment
Я добавил БД для mailer_receipts, так что если записи с одинаковым уведомлением_идентификатором и если для обоих удалено верно -> уничтожить обе. И запускайте это действие одновременно с Очистить корзину. - person Jai Day; 10.04.2017
comment
:) Не забывайте голосовать за ответы и давать правильные ответы! - person Marcos R. Guevara; 11.04.2017