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

时间:2015-08-13 18:51:20

标签: ruby-on-rails ruby ruby-on-rails-3 ancestry acts-as-list

我有一个Ruby on Rails 3应用程序,它使用ancestry gem为模型提供分层树结构,并结合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不仅更改对象上的位置,还会更改所有对象的位置后代对象也是如此。这会导致所有后代对象的位置不可靠并导致不必要的数据库调用。

有没有办法防止这种情况发生,或者这是预期的行为?

非常感谢任何帮助;谢谢!

1 个答案:

答案 0 :(得分:0)

似乎已经根据此issue report知道此问题,并且pull request正在解决此问题。作为一个短期修复,我按照Brendon的建议发布了pull请求,并通过声明自定义范围绕过了错误,从而绕过了存在错误的scope_changed?方法。

希望这有助于将来节省一些时间和白发。