ROR-SQL-單筆資料的上下移動🙄


#1

大家好

今天來詢問一下 資料庫的用法

但我的想法 感覺還是很老派

所以上來詢問看看 有沒有比較好的做法 或是GEM可以用

有個功能如下

新增大類項目 而單一項目會需要有

標題 + 編輯 刪除 上移 下移

一個內容 + 4個動作

編輯是正常的 但是刪除跟移動的功能 我感覺我用很老套的方式在做 但也不是不對 只是很LOW阿…

我的作法是 3個欄位 order_number order_up order_dwon

order_number 紀錄目前排序編號 前端顯示的oder排序也用此欄位

order_up 記錄它的上方是哪一個 id

order_dwon 記錄他的下方是哪一個 id

然後每一次 刪除 上移 下移 都會有不少的判斷if 去處理相對應關係 因為有可能

1.原上方id被刪除

2.已經是最上方了

3.原下方方id被刪除

4.已經是最下方了

光移動一個id 我要寫一堆判斷式 也是很奇杷 感覺就是c# 或是 vb 在硬搞這種功能

不曉得在ruby的體制下 有沒有比較好的解決方案

:roll_eyes::roll_eyes:


#2

真的很老派…

acts_as_list + ( acts_as_tree | awesome_nested_set )

結束


#3

用這個好高檔阿= =

我是有把這個拿來做樹狀結構

其他的按鈕還是要另外刻

所以我想說自己刻算了

直接找 bootstrap 類似的外觀 自己弄也不錯看

不過方法真的是老套 = =

今天還用了2種方式

方式1 陣列移動 不過這方式超畸形 直接拉倒不敢用

方式2

點擊3號 往上移  抓上方id 與上方互換
User.where.('id  < ?' , 3).last

點擊3號 往下移  抓下方id 與下方互換
User.where.('id  > ?' , 3).first

好像這個方式簡寫蠻多的

單純的小嘗試 :sweat_smile:


#4

附加解釋好了, acts_as_list 是用來做排序的,可以指定排序依據而非 global (類似 by owner_id)需要多一個 position 的 column,用法和你做的完全一樣就是,會自動編號有的沒的

不過這邊請注意一下,如果你單純需要置頂,則不要用 acts_as_list,一樣多一個 position 即可,然後讓使用者輸入最大值,類似 css 中的 z-index 的用法就是,其餘都是預設(order by desc 時 nil 都會在最下面)

而 acts_as_tree / awesome_nested_set 單純做樹狀結構的,acts_as_tree 只需要 parent_id,而 awesome_nested_set 需要再多 left / right 兩個值來做樹狀維持,我會建議上面這些你都玩玩看,沒有所謂的很高檔的問題,而是你武器不夠多,以後打怪會很困難唄||| 請建立你自己的武器庫就是