0

我有一个 Ruby on Rails 3 应用程序,它使用祖先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不仅会改变对象的位置,还会改变所有后代对象的位置。这会导致所有后代对象的位置动作/不可靠,并导致不必要的数据库调用。

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

任何帮助将不胜感激; 谢谢!

4

1 回答 1

0

根据这个问题报告,这个问题似乎已经知道,并且有一个解决它的拉取请求。作为一个短期修复,我遵循了 Brendon 发布在拉取请求中的建议,并通过声明自定义范围来绕过错误,从而绕过scope_changed?存在错误的方法。

希望这可以帮助将来的人节省一些时间和白发。

于 2015-08-27T13:33:14.143 回答