如何自动订购/重新排序has_many关联?

时间:2015-10-29 15:11:51

标签: ruby-on-rails ruby-on-rails-4

我有一个列表记录,每个列表都有许多阶段,用户将创建/删除/移动这些阶段。目前,我在舞台上有一个“位置”列,用于跟踪舞台在列表中的位置,我只是按升序查询它们。但是,在删除某个阶段或需要将某个阶段插入列表中间的情况下,这会出现问题。这样做需要在插入/删除阶段的位置后更新每个阶段的位置,这对我来说不是很干净。

这是我所拥有的准确的例子:

class List < ActiveRecord::Base
    has_many :stages
end

class Stage < ActiveRecord::Base
    default_scope { order(position: :asc) }
end

然后,如果我想做一些事情,比如在舞台中间插入一个舞台,我需要这样做:

def insert(stage, position)
    stage.position = position
    stages.where('position >= ?', position).each { |stage| stage.update(position: stage.position + 1) }
    stages << stage
end

有什么方法可以轻松设置这些阶段的顺序,以便移动他们的订单或删除不需要那么多手动更新的阶段?有点像counter_cache如何自动更新计数

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

事实证明,有一个叫做'acts_as_list'的宝石就是为了这件事。 谢谢D-side!