3

私は次のモデルを持っています:

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 だけを期待していました。しかし、代わりに、これはすべて進行しており、コメントの記録は破られています。

誰もこれを見たことがありますか?

ありがとうございました

UPDATE 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
4

4 に答える 4

3

これは記録を破るべきではありません。ノードを削除するときは、ツリーを剪定する必要があります。のコメントはそれをacts_as_nested_set言う

「エントリの追加と削除の両方で、テーブル全体への書き込みが必要です。」

このbefore destroyメソッドacts_as_nested_setのコードは、Commentレコードを削除するときにテーブルを再編成しようとしていますが、これは正常な動作です。

于 2011-02-25T02:06:54.677 に答える
2

ノードを削除するときに階層を維持しようとしているようです。これは、SQL でよくある問題です。

どのライブラリを使用していますか? 素晴らしいネストされたセット? なぜそれが壊れたレコードになるのか、私にはわかりません。

ネストされたセットのアプローチの詳細については、次を参照してください。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

削除がこのように管理される理由については、以下の「ネストされたセット モデル」セクションと「削除されたノード」サブセクションを参照してください。

したがって、delete ステートメントは通常の動作です。

于 2011-02-25T01:53:59.157 に答える
1

Simpleacts_as_nested_setは、コメント テーブル内のすべてのレコードのツリーを作成します。スレッドごとに 1 つのコメント ツリーを作成する必要があると思います。例 acts_as_nested_set :parent_column => :parent_id, :scope => [:commentable_id, :commentable_type]

によって作成された関連付けがデフォルトで に設定されacts_as_nested_setていることにも注意してください。そのため、正しく設定されていることを確認してください。:dependent:delete_all:parent_id

グループを削除するときに上記の変更を行うと、(スレッドを介して) グループに属するコメントのみが削除されます。

ところで、 ruby ​​-toolboxで推奨されているawesome_nested_setを使用します。

于 2011-03-03T14:29:33.357 に答える
1

使用する gem が項目を削除できず、ネストを正しく維持できない可能性は低いと思われますが、決して不可能ではありません。ですから、それはあなたがしていることに関連しています。ポリモーフィックな関係も関係しているかもしれません。

ensure_max_nestedset_level削除してテストしましたか?それはうまくいきますか?単一のコメントを削除すると機能しますか? 親のコメントを削除しますか? (その下にネストされた要素があります)。グループ/スレッドを削除したときにのみ失敗しますか?

于 2011-03-02T21:24:08.287 に答える