我在我的網站上爲我的用戶消息傳遞線程功能使用了「acts_as_tree」插件。我有一種方法可以刪除選定的消息。這些消息實際上並未被刪除。他們的sender_status或recipient_status列設置爲1,具體取決於用戶是消息的發件人還是收件人。我將如何destroy_all或delete_all記錄除了在軌道上的紅寶石?
無論如何,如果兩個用戶都將這些狀態設置爲1,那麼最後一行確保消息行完全從數據庫中移出。現在,只要它不是被刪除的父消息就沒有問題。如果父消息被刪除,那麼沒有被選擇刪除的孩子將不能再被訪問。
這裏是方法:
def delete_all_users_selected_messages(message_ids, user_id, parent_id)
Message.where(:id => message_ids, :sender_id => user_id).update_all(:sender_status => 1)
Message.where(:id => message_ids, :recipient_id => user_id).update_all(:recipient_status => 1)
Message.delete_all(:sender_status => 1, :recipient_status => 1, :parent_id => parent_id).where("id != ?", parent_id)
end
這是很明顯我想要做的事。我需要忽略父項。因此,在主鍵等於parent_id的情況下,意味着該行是父項(通常parent_id爲零,但我需要將其設置爲主鍵值,這是因爲其他原因,長話短說並不重要)。無論如何,有一個SQL語句可以添加到tat方法最後一行的結尾嗎?爲了確保它只刪除行的id不等於parent_id的消息?
我可以安排parent_id行永遠不被允許刪除,除非實際線程(引用消息表對話的MessageThreads表)被刪除。
無論如何我可以做到這一點,所以當該delete_all方法運行時,這個父行會被忽略?
親切的問候
得到未定義的方法的孩子,所以我試着Message.where(:id => parent_id).first.children.delete_all(:sender_status => 1,:recipient_status => 1)..然後得到錯誤數量的參數1爲0 – LondonGuy 2012-02-22 00:15:00
對不起,我錯過了'第一個'。你能把這條鏈分成多行語句,以便我們可以找到錯誤發生的地方嗎?例如先獲取父記錄,然後調用'children ....'。 – 2012-02-22 00:20:47
更新了答案。 delete_all不接受參數。 – 2012-02-22 00:26:19