Tôi đang sử dụng plugin "actions_as_tree" cho tính năng chuỗi tin nhắn của người dùng trên trang web của mình. Tôi có một phương pháp giúp xóa các thư đã chọn có thể. Các tin nhắn không thực sự bị xóa. Các cột sender_status hoặc recipient_status của họ được đặt thành 1 tùy thuộc vào người dùng là người gửi hoặc người nhận thư.Làm thế nào tôi có thể hủy bỏ_all hoặc xóa các bản ghi trừ một bản ghi trên ruby trên đường ray?
Dù sao nếu cả hai người dùng có trạng thái đó được đặt thành một thì dòng cuối cùng đó đảm bảo rằng hàng thư được di chuyển hoàn toàn từ cơ sở dữ liệu. Bây giờ điều này là tốt miễn là nó không phải là tin nhắn cha mẹ bị xóa. Nếu thông báo cha bị xóa thì những đứa trẻ chưa được chọn để xóa sẽ không thể truy cập được nữa.
Đây là phương pháp:
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
Đó là khá rõ ràng những gì tôi đang cố gắng làm. Tôi cần phải bỏ cha mẹ. Vì vậy, nơi khóa chính bằng với parent_id có nghĩa là hàng đó là một parent (thường là parent_id là nil nhưng tôi cần nó được đặt thành giá trị khóa chính cho một số lý do khác, câu chuyện dài và không quan trọng). Dù sao là có một câu lệnh SQL tôi có thể thêm vào cuối dòng cuối cùng trong phương pháp tat? Để đảm bảo rằng nó chỉ xóa các thư có id của hàng không bằng parent_id?
Tôi có thể sắp xếp hàng parent_id để không bao giờ được phép xóa trừ khi chuỗi thực tế (bảng MessageThreads tham chiếu đến các cuộc hội thoại bảng tin) bị xóa.
Bất kỳ cách nào tôi có thể thực hiện để hàng này bị bỏ qua khi phương thức delete_all đó chạy?
Trân trọng
Có phương thức không xác định trẻ em vì vậy tôi đã thử Message.where (: id => parent_id) .first.children.delete_all (: sender_status => 1,: recipient_status => 1) .. sau đó nhận được số lượng sai đối số 1 cho 0 – LondonGuy
Có lỗi tôi đã bỏ lỡ 'đầu tiên'. Bạn có thể tách chuỗi này thành nhiều câu lệnh để chúng tôi có thể tìm thấy lỗi xảy ra ở đâu không? Ví dụ, lấy bản ghi cha trước, sau đó gọi 'con ....'. –
Cập nhật câu trả lời. delete_all không chấp nhận tham số. –