ruby-on-rails - 基于其他属性的索引属性
问题描述
我们有几个需要子对象的模型
每个孩子都应该有一个唯一的顺序 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
这将从internal_id
1 开始编号,范围为parent_id
列,如您的示例中所示。如果你想从 0 开始设置选项top_of_list: 0
。
有关其他选项,请参阅acts_as_list 存储库。
推荐阅读
- c - vcpkg curl 端口不支持 FTP?
- python - treelite 不能用 pip 安装在 conda 中
- python - 如何将 numpy 数组从 numpy.int64 转换为 datetime?
- curl - 传入的 WebHook 和动态用户名/频道
- java - 我在JAVA中的猪骰子游戏不会保存每个玩家的分数,即使达到分数游戏也不会停止
- google-chrome - Chrome 问题:new Date() 返回没有时区的时间,但只是 Windows 7 操作系统中的偏移量
- excel - Office 365 Excel 中 Power Pivot 计算列中正确的 DAX GROUPBY 语法是什么
- node.js - 使用passportjs在我的登录页面上出现“缺少凭据”错误(两种策略)
- javascript - 在 Javascript 中导入异步函数
- mfc - GetDateFormatEx 格式字符串和自定义文本