【发布时间】:2012-03-12 08:04:40
【问题描述】:
我在我的网站上为我的用户消息线程功能使用“acts_as_tree”插件。我有一种方法可以删除选定的消息。这些消息实际上并没有被删除。他们的 sender_status 或 recipient_status 列设置为 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 的消息?
我可以安排永远不允许删除 parent_id 行,除非实际线程(引用消息表对话的 MessageThreads 表)被删除。
我怎样才能做到这一点,以便在运行 delete_all 方法时忽略该父行?
亲切的问候
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems