acts_as_list在一对多关系中,将多端按照作为一个有顺序的列表来存储,并提供一些移动等方法来辅助
首先进行配置,在一的一端需要position字段,为整形
belongs_to :admin,class_name: 'Admin'
acts_as_list scope: :admin
多的一段
class Admin < ActiveRecord::Base
has_many :users,-> { order("position DESC") },class_name:'User'
end
在rails4中需要写成-> { order("position DESC") }这种格式,之前的格式被废弃
配置完成后做一些测试
在添加时不需要通过from的形式去添加,但此时数据库中的position字段是有值的,我们通过日志可以看到,在添加用户的时候,position的字段是根据admin_id来决定的。一个admin_id对应着从1到n的一个存储序列。
添加的时候如果选择一个admin_id,此时系统首先会去数据库查询该admin_id是否在用户表中被其他记录引用,如果有,查出引用该admin_id最大的position值,此时添加的记录中position在最大的基础上加1.如果该admin_id还没出现在用户表中,则该添加的用户记录中position的值为1
修改的时候如果将admin_id的值做了改变,那么数据库中的position需要改变。该条记录没修改之前的admin_id对应的所有记录的position的值都减少1.该条记录对应的position值不变。修改后的admin_id中,以该条记录的position为基础。大于等于该position 的值全部加1,小于的保持不变
对position的值也可以通过一些方法去修改,即改变记录的位置
list_item.insert_at(2)
list_item.move_lower
will do nothing if the item is the lowest itemlist_item.move_higher
will do nothing if the item is the highest itemlist_item.move_to_bottom
list_item.move_to_top
list_item.remove_from_list