Я пытаюсь удалить беседу с драгоценным камнем 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