gpt4 book ai didi

ruby-on-rails - 我将如何 destroy_all 或 delete_all 记录,除了 ruby​​ on rails 中的一条记录?

转载 作者:数据小太阳 更新时间:2023-10-29 06:40:54 41 4
gpt4 key购买 nike

我在我的网站上为我的用户消息线程功能使用“acts_as_tree”插件。我有一种方法可以删除选定的消息。这些消息实际上并没有被删除。它们的 sender_status 或 recipient_status 列设置为 1,具体取决于邮件的发件人或收件人是哪个用户。

无论如何,如果两个用户都将这些状态设置为 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 被忽略。因此,主键等于 parent_id 的地方意味着该行是父行(通常 parent_id 为 nil 但出于其他原因我需要将其设置为主键值,长话短说并不重要)。无论如何,有没有我可以添加到 tat 方法最后一行末尾的 SQL 语句?要确保它只删除行 ID 不等于 parent_id 的消息?

我可以安排永远不允许删除 parent_id 行,除非实际线程(引用消息表对话的 MessageThreads 表)被删除。

有什么办法可以让这个父行在运行 delete_all 方法时被忽略?

亲切的问候

最佳答案

如今在 Rails 4 中,您可以:

Model.where.not(attr: "something").delete_all

Model.where.not(attr: "something").destroy_all

不要忘记差异:

  • destroy_all:关联对象通过调用它们的destroy 方法与该对象一起被销毁。实例化所有记录并一次销毁它们,因此对于大型数据集,这可能很慢
  • delete_all:所有关联的对象都被立即销毁,而不调用它们的destroy 方法。不调用回调。

关于ruby-on-rails - 我将如何 destroy_all 或 delete_all 记录,除了 ruby​​ on rails 中的一条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9387269/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com