私は自分のウェブサイト上の私のユーザメッセージングスレッド機能のために "acts_as_tree"プラグインを使用しています。私は選択されたメッセージを削除する方法を持っています。メッセージは実際には削除されません。 sender_status列またはrecipient_status列は、メッセージの送信者または受信者がどのユーザーかに応じて1に設定されます。ruby on railで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はnilですが、他の理由でプライマリキー値に設定する必要があります。とにかく、tatメソッドの最後の行の最後に追加できるSQL文はありますか?行のIDがparent_idと等しくないメッセージだけを削除するようにするには?
実際のスレッド(メッセージテーブルの会話を参照するMessageThreadsテーブル)が削除されない限り、parent_id行が決して削除されないようにすることができます。
どうすればこのdelete_allメソッドを実行すると、この親行が無視されるようにすることができますか?
種類について
私はMessage.where(:id => parent_id).first.children.delete_all(:sender_status => 1、:recipient_status => 1)を試しました。 0 – LondonGuy
はい私は「最初に」逃した。このチェーンを複数の行ステートメントに分割して、エラーの発生場所を見つけることができますか?たとえば、親レコードを最初に取得し、次に 'children ....'を呼び出します。 –
答えを更新しました。 delete_allはパラメータを受け入れません。 –