ruby-on-rails - Rails - Comments w acts_as_nested_set - 当删除从属记录时删除销毁数据

标签 ruby-on-rails ruby-on-rails-3 nested-sets acts-as-nested-set

我有以下模型:

class Group < ActiveRecord::Base
    has_many :threads, :dependent => :destroy

class Thread < ActiveRecord::Base
    has_many :comments, :as => :commentable, :dependent => :destroy

 class Comment < ActiveRecord::Base
    belongs_to :commentable, :polymorphic => true
    acts_as_nested_set

我遇到的问题是,当用户删除群组时,各种评论都会被破坏或删除。我查看了日志,这是正在发生的事情:

Comment Load (0.8ms)  SELECT "comments".* FROM "comments" WHERE ("comments".commentable_id = 101 AND "comments".commentable_type = 'Thread') ORDER BY comments.created_at DESC
AREL (0.9ms)  DELETE FROM "comments" WHERE ("comments"."lft" > 649 AND "comments"."rgt" < 650)
AREL (0.4ms)  UPDATE "comments" SET "lft" = ("lft" - 2) WHERE ("lft" > 650)
AREL (0.5ms)  UPDATE "comments" SET "rgt" = ("rgt" - 2) WHERE ("rgt" > 650)
AREL (0.2ms)  DELETE FROM "comments" WHERE ("comments"."id" = 381)
AREL (0.4ms)  DELETE FROM "comments" WHERE ("comments"."lft" > 645 AND "comments"."rgt" < 646)
AREL (0.4ms)  UPDATE "comments" SET "lft" = ("lft" - 2) WHERE ("lft" > 646)
AREL (0.4ms)  UPDATE "comments" SET "rgt" = ("rgt" - 2) WHERE ("rgt" > 646)
AREL (0.2ms)  DELETE FROM "comments" WHERE ("comments"."id" = 380)
AREL (0.3ms)  DELETE FROM "comments" WHERE ("comments"."lft" > 648 AND "comments"."rgt" < 651)
AREL (0.3ms)  UPDATE "comments" SET "lft" = ("lft" - 4) WHERE ("lft" > 651)
AREL (0.3ms)  UPDATE "comments" SET "rgt" = ("rgt" - 4) WHERE ("rgt" > 651)
AREL (0.2ms)  DELETE FROM "comments" WHERE ("comments"."id" = 379)
AREL (0.3ms)  DELETE FROM "comments" WHERE ("comments"."lft" > 644 AND "comments"."rgt" < 647)
AREL (0.4ms)  UPDATE "comments" SET "lft" = ("lft" - 4) WHERE ("lft" > 647)
AREL (0.4ms)  UPDATE "comments" SET "rgt" = ("rgt" - 4) WHERE ("rgt" > 647)
AREL (0.2ms)  DELETE FROM "comments" WHERE ("comments"."id" = 378)
AREL (0.4ms)  DELETE FROM "comments" WHERE ("comments"."lft" > 642 AND "comments"."rgt" < 643)
AREL (0.8ms)  UPDATE "comments" SET "lft" = ("lft" - 2) WHERE ("lft" > 643)
AREL (0.4ms)  UPDATE "comments" SET "rgt" = ("rgt" - 2) WHERE ("rgt" > 643)
AREL (0.2ms)  DELETE FROM "comments" WHERE ("comments"."id" = 377)
AREL (0.7ms)  DELETE FROM "comments" WHERE ("comments"."lft" > 641 AND "comments"."rgt" < 652)
AREL (0.9ms)  UPDATE "comments" SET "lft" = ("lft" - 12) WHERE ("lft" > 652)
AREL (0.9ms)  UPDATE "comments" SET "rgt" = ("rgt" - 12) WHERE ("rgt" > 652)
AREL (0.3ms)  DELETE FROM "comments" WHERE ("comments"."id" = 376)
AREL (0.4ms)  DELETE FROM "threads" WHERE ("threads"."id" = 101)
AREL (0.4ms)  DELETE FROM "groups" WHERE ("groups"."id" = 57)

这是嵌套行为的正常行为吗?我希望只有 Comment.id = XXXX 的 DELETE FROM COMMENTS。但相反,这一切都在发生,评论记录正在被打破。

有人见过这个吗?

谢谢

更新 w 用于防止深度嵌套的内容:

  after_save :ensure_max_nestedset_level
  def ensure_max_nestedset_level
    if self.level > 2
      self.move_to_child_of(parent.parent)
    end
  end

最佳答案

这不应该打破记录。删除节点时,必须修剪树。 The comments in acts_as_nested_set这么说

"both adding and removing an entry require a full table write."

this before destroy method in acts_as_nested_set中的代码当您删除 Comment 记录时正在尝试重组表,这是正常行为。

关于ruby-on-rails - Rails - Comments w acts_as_nested_set - 当删除从属记录时删除销毁数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062582/

相关文章:

ruby-on-rails - Ruby on Rails 中 'for' 和 'each' 迭代器之间的区别

ruby-on-rails - Rails 3 和 mongo db (mongoid) 中的基本文本搜索

ruby-on-rails - rails : The action 'index' could not be found for ContactsController

sql - 如何在同一个查询中选择直系子女和祖先

ruby-on-rails - 在开发中使用 Devise 1.3.4 使用 Gmail 发送电子邮件

javascript - 如何在 Rails 3.1 中创建悬停弹出窗口

ruby-on-rails - 在 Rails 中按字母顺序排序

ruby-on-rails-3 - 使用 Paperclip 将视频上传到 Heroku - 如何制作缩略图?

javascript - Raphael JS 嵌套转换

mysql - 选择具有唯一值的行数