首页 > 解决方案 > 基于其他属性的索引属性

问题描述

我们有几个需要子对象的模型

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

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

标签: ruby-on-railsactiverecord

解决方案


这正是acts_as_list gem 的用途。首先,将它添加到您的 Gemfile 中:

gem 'acts_as_list'

然后在您的模型中,添加:

acts_as_list column: :internal_id, scope: :parent_id

这将从internal_id1 开始编号,范围为parent_id列,如您的示例中所示。如果你想从 0 开始设置选项top_of_list: 0

有关其他选项,请参阅acts_as_list 存储库。


推荐阅读