0

私は現在、コメントスレッドに宝石「nested_set」を使用しています。Rails - ネストされた動作 - 最大レベルの適用

私がやりたいことは、コメントレベルが2レベル以上深くならないようにすることです。私が疲れたことは次のようなものでした:

class Comment < ActiveRecord::Base 
    .... 
    before_save :ensure_max_nestedset_level 
    private 

    # We don't want comments to go more than 2 levels deep. That's overkill 
    def ensure_max_nestedset_level 
     if self.level > 2 
     self.level = 2 
     end 
    end 

end 

しかし、レベルを設定することはできませんが、オブジェクトレベルを取得するだけのようです。コメントスレッドのためにMAXレベルを2レベルまで強化することを目標としています。誰もが起こるからそれを強制する方法を提案することはできますか?

ユースケースがあること:ユーザーが(XXXX程度)最後の1に返信するとき

Comment Main (level 0) 

    Comment Reply (level 1) 

    Comment Reply about XXXX (level 2) 

私はコメントは3のレベルに設定することにしたくない、私がそれをキャップしたいです2.

アイデア?ありがとう

+1

レベルに関するいくつかのverbageがあるようです:http://rubydoc.info/gems/nested_set/1.6.4/frames 'each_with_level'を使って試しましたか? – Steve

+0

@スティーブ、ありがとうございますが、私はここでその請求書に合っているかどうかはわかりません。私はeach_with_levelが結果をループするためだと思う。私が扱っているのは、新しいネストされたオブジェクトを挿入し、レベルが深く設定されないようにすることです。右? – AnApprentice

答えて

1

もっと良い解決策があるかもしれませんが、これはうまくいくようです。

class Comment < ActiveRecord::Base 
    acts_as_nested_set 

    after_save :check_level 

    def check_level 
    if level > 2 
     move_to_child_of(parent.parent) 
    end 
    end 
end 

before_saveにこれを変更すると、それは失敗しますことに注意してください、私は理由を知りません。おそらく、それは木のバランスを変えることと関係がありますか?

+0

奇妙な、before_saveは私のために失敗しません。しかし、失敗するのはIFレベルか、self.level(すべて小文字)で常に0を返した場合 – AnApprentice

+0

acts_as_nested_setが保存後に実行されるため、そのように見えますか?コメントオブジェクトbefore_saveのロガー出力は、parent_id:251、lft:nil、rgt:nil – AnApprentice