我有一个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
不仅改变了对象上的位置,但也改变了所有后代对象的位置。这将导致所有后代对象的位置不可靠,并导致不必要的数据库调用。
是否有任何方法可以防止这种情况的发生,或者这是预期的行为?
任何帮助将非常感激;谢谢!
根据这个问题报告,似乎这个问题已经知道了,并且有一个拉取请求来解决它。作为短期修复,我遵循Brendon的建议发布到拉请求,并通过声明一个自定义作用域来绕过bug,从而绕过了存在bug的scope_changed?
方法。
希望这能帮助将来的人节省一些时间和白发。