1

私はcurrent_userのすべてのメッセージを事実上削除する方法を持っています。つまり、メッセージテーブルのすべてのメッセージのステータスを1に設定するということです。つまり、メッセージを削除したユーザーにメッセージは表示されません。どのようにして、レール上の関連するレコードを正しく破壊するのですか?

message_threadが メッセージはここに1つmessage_thread

を持っているメッセージに属しているが、このの世話をする私のモデルのメソッドです:

def delete_all_users_messages(user_id, parent_id) 
     message = Message.find_by_parent_id(parent_id) 
     message.children.where(:sender_id => user_id).update_all(:sender_status => 1) 
     message.children.where(:recipient_id => user_id).update_all(:recipient_status => 1) 
     thread = message.message_thread 
     thread.update_attribute(:sender_status, 1) if thread.sender_id == user_id 
     thread.update_attribute(:recipient_status, 1) if thread.recipient_id == user_id 
     if thread.sender_status == 1 && thread.recipient_status == 1 
     thread.destroy 
     Message.destroy_all(:parent_id => parent_id) 
     end 
    end 

私は私のメッセージテーブルでメッセージを参照するmessage_threadsテーブルを持っています。 parent_idが意味するメッセージのidと等しい会話の最初のメッセージを参照します。この最初のメッセージには子があります。

私のメソッドの最後に表示されているように、両方のユーザーステータスがそのテーブルに設定されている場合はmessage_threadsテーブル内のスレッドを破棄し、残りのメッセージを削除します。

私はこれを1人のユーザーアカウントでテストしました。これは、ユーザーmessage_threadのステータスを1に変更し、すべてのユーザーメッセージを更新するために機能しました。

は、だから私は、彼らはとの会話にあったユーザーのアカウントに行って、同じことをしようと、私が手に:私は、このユーザーのレコードのメッセージのステータスのを確認すると

に設定されますか。メッセージスレッドは削除されます。

しかし、メッセージがメッセージテーブルに残っているし、私が手に:ここ

深すぎる

スタックレベルは、コントローラのアクションです:

def destroy_all_messages 
    Message.delete_all_users_messages(current_user.id, params[:format]) 
    flash[:success] = "Messages deleted" 
    redirect_to messages_path 
    end 

は、連続ループのように見えます私のログこれが問題の原因となるのでしょうか?私はいくつかを削除しました。なぜなら、それはすべて収まるわけではありませんが、ログ内で繰り返されることがわかります。

Started DELETE "/messages/delete_all_messages.315" for 127.0.0.1 at 2012-02-21 15:27:14 +0000 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] Processing by MessagesController#destroy_all_messages as 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] Parameters: {"authenticity_token"=>"yelkcp72223dji4YVumgG9gUEK/U/Mwqwd0pc1WRG+0="} 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 4 LIMIT 1 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] Message Load (0.9ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 LIMIT 1 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] SQL (20.8ms) UPDATE `messages` SET `sender_status` = 1 WHERE `messages`.`parent_id` = 315 AND `messages`.`sender_id` = 4 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] SQL (37.3ms) UPDATE `messages` SET `recipient_status` = 1 WHERE `messages`.`parent_id` = 315 AND `messages`.`recipient_id` = 4 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] MessageThread Load (0.4ms) SELECT `message_threads`.* FROM `message_threads` WHERE `message_threads`.`message_id` = 315 ORDER BY message_threads.updated_at DESC LIMIT 1 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] (0.1ms) BEGIN 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] (0.3ms) UPDATE `message_threads` SET `recipient_status` = 1, `updated_at` = '2012-02-21 15:27:14' WHERE `message_threads`.`id` = 803 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] (0.4ms) COMMIT 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] (0.1ms) BEGIN 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] SQL (0.2ms) DELETE FROM `message_threads` WHERE `message_threads`.`id` = 803 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] (0.3ms) COMMIT 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] Message Load (0.3ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] (0.1ms) BEGIN 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] CACHE (0.0ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`parent_id` = 315 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] (0.1ms) ROLLBACK 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] Completed 500 Internal Server Error in 400ms 
[51b1090d2a7185c9b2f42fa3213006d1] [127.0.0.1] 
SystemStackError (stack level too deep): 
    actionpack (3.2.0) lib/action_dispatch/middleware/reloader.rb:70 

種類は、私はループがdestroy方法に起因している疑い

答えて

2

に関して。あなたが投稿したコードから正確にはわかりませんが、destroyまたはbefore_destroyのメソッドを他のオブジェクトのdestroyメソッド、または:dependent => :destroy[_all]修飾子を持つリレーションと呼びます。それらのいずれかが循環依存を作成することができれば、あなたはループで立ち往生しています。

また、destroyメソッドで何もする必要のないモデルの場合は、代わりにdeletedelete_allを使用してください。これらのデストラクタは実行されません。つまり、DBから直接行を削除するだけです。そのため、処理が高速になり、ループが発生する危険はありません。もちろん、モデルが子どもたちをきれいにすることが期待されるときにはこれを行うことはできませんが、「葉」モデルでは素晴らしいことです。

希望すると便利です。

+0

この "Message.destroy_all(:parent_id => 315)を実行するだけでも、ループのコンソールにスタックレベルが深すぎるというエラーが表示されます。私は子供たちと関係があると思います。 – LondonGuy

+0

@LondonGuy - おそらくそうです。それを 'delete_all'呼び出しに変更できますか?メッセージに自分自身の子がなくても削除する必要がある場合は、それを修正する必要があります。 –

+0

私はそれを理解したと思います。これは、すべての子の最初の親がparent_idをメッセージのprimary_idに設定していたためです。しかし私が "子供"と呼んだとき、私がすべてのメッセージを呼び出すことができるように、それを私のプロジェクトの他の場所で設定しました。最初のものが設定されていない場合は、私は子供に電話をしたときにそれは除外されました。だから、parent_idでメッセージを見つけるのではなく、代わりにsender_idとrecipient_idを使うべきです。それはちょうどparent_idだけで簡単に見つけることができますが、解決策が見つからない場合は別の方法で行う必要があります。 – LondonGuy

関連する問題