【问题标题】:Rails - Acts as nested - Enforcing a Max LevelRails - 充当嵌套 - 强制执行最大级别
【发布时间】:2011-06-30 02:59:21
【问题描述】:

我目前正在使用 gem 'nested_set' 进行评论线程。

我想要做的是防止评论级别超过 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

但看起来你不能设置一个级别只获得一个对象级别。目标是为评论线程强制执行 2 级深度的 MAX。任何人都可以建议一种方法来强制这种情况发生吗?

用例是:

Comment Main (level 0)

  Comment Reply (level 1)

    Comment Reply about XXXX (level 2)

当用户回复最后一个(关于 XXXX)时,我不希望将评论设置为 3 级,我想将其上限设置为 2。

想法?谢谢

【问题讨论】:

  • 这里似乎有一些与级别有关的措辞:rubydoc.info/gems/nested_set/1.6.4/frames您是否尝试过使用each_with_level
  • @Steve,谢谢,但我不确定这是否符合要求。我认为 each_with_level 用于循环结果。我正在处理的是插入一个新的嵌套对象,并希望防止将级别设置为深。对吗?

标签: ruby-on-rails ruby-on-rails-3 nested nested-sets acts-as-tree


【解决方案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 会使其失败,我不知道为什么。也许它与树的重新平衡有关?

【讨论】:

  • 奇怪, before_save 对我来说并没有失败。但是失败的是 IF LEVEL 或 self.level (全小写),总是返回 0
  • 看起来是因为acts_as_nested_set 在保存后运行?注释对象 before_save 的记录器输出显示:parent_id: 251, lft: nil, rgt: nil
猜你喜欢
  • 2016-05-17
  • 2021-09-17
  • 2014-04-10
  • 2016-10-14
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多