基于其他属性的索引属性

时间:2019-04-18 19:50:19

标签: ruby-on-rails activerecord

我们有一些需要子对象的模型

每个孩子都应具有唯一的顺序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

是否有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

这正是act_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