我们有几个需要儿童物品的模型
每个孩子都应该有一个唯一的顺序ID作为主键和一个基于关系的唯一顺序ID,如下:
Object id: 1
Children id: 1, internal_id: 1
Children id: 2, internal_id: 2
Object id: 2
Children id: 3, internal_id: 1
Children id: 6, internal_id: 2
Children id: 7, internal_id: 3
Object id: 3
Children id: 4, internal_id: 1
Children id: 5, internal_id: 2
Children id: 8, internal_id: 3
Children id: 9, internal_id: 4
目前我正在使用before_save
过滤器来固定internal_id
,但我觉得这是一个不好的做法,可以用一些sql魔法改进
def define_internal_id
self.internal_id = 1 + Children.unscoped.where(parent_id: self.parent_id).count
end
before_save :define_internal_id
有没有更好的方法来解决这个问题?
这正是acts_as_list gem的用途。首先,将它添加到您的Gemfile:
gem 'acts_as_list'
然后在您的模型中添加:
acts_as_list column: :internal_id, scope: :parent_id
这将编号从1开始的internal_id
,范围为parent_id
列,如您的示例中所示。如果你想从0开始设置选项top_of_list: 0
。
有关其他选项,请参阅acts_as_list repo。