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