Rails: Ancestry + Acts_as_List Gems 在更改父对象时未按预期工作

Rails: Ancestry + Acts_as_List Gems Not Working as Expected When Changing Parent Object

我在 Rails 3 上有一个 Ruby 应用程序,它使用 ancestry gem to provide a hierarchical tree structure for a model in combination with the acts_as_list gem 在层次结构的每个级别内提供明确的定位。

class Obj < ActiveRecord::Base
    ...
    has_ancestry
    acts_as_list scope: [:ancestry]
    ...
end

此外,我在对象上使用以下方法来更改对象的父对象:

# Credit to the author of the ancestry gem for the code.
def move_to_child_of(reference_instance)
      transaction do
            remove_from_list
            self.update_attributes!(:parent => reference_instance)
            add_to_list_bottom
        save!
    end
end

在以下情况下一切正常:

我遇到的问题是改变一个有后代的对象的父对象会导致acts_as_list不仅改变对象的位置而且也更改所有后代对象的位置。这会导致所有后代对象的位置 act/be 不可靠并导致不必要的数据库调用。

有什么方法可以防止这种情况发生,或者这是预期的行为吗?

如有任何帮助,我们将不胜感激;谢谢!

根据这个 issue report and has a pull request 解决方法,似乎这个问题已经知道了。作为短期修复,我遵循了发布到拉取请求的 Brendon 的建议,并通过声明自定义范围绕过了错误,从而绕过了存在错误的 scope_changed? 方法。

希望这能帮助将来的人节省一些时间,减少白发。