ruby-on-rails - Rails gemacts_as_list:当列表项被销毁时如何处理列表项的重新排序?
问题描述
我以这种方式使用acts_as_list v0.9.17:
class ListItem < ActiveRecord::Base
acts_as_list scope: [:column1_id, :column2_id], :add_new_at => :bottom
end
当创建一个新的(作用域的)时@list_item
,比如说column1_id
is 1
,column2_id
is11
和column3_id
is 37
,数据库看起来如下所示,正如预期的那样:
id | position | column1_id | column2_id | column3_id
--- | -------- | ---------- | ---------- | ----------
750 | 1 | 1 | 11 | 89
751 | 2 | 1 | 11 | 56
752 | 3 | 1 | 11 | 105
753 | 4 | 1 | 11 | 25
754 | 5 | 1 | 11 | 37
但是,当 a@list_item
被销毁时,比如说column1_id
is 1
、column2_id
is11
和column3_id
is 56
(记录 id 751
),那么数据库如下所示:
id | position | column1_id | column2_id | column3_id
--- | -------- | ---------- | ---------- | ----------
750 | 1 | 1 | 11 | 89
752 | 3 | 1 | 11 | 105
753 | 4 | 1 | 11 | 25
754 | 5 | 1 | 11 | 37
这意味着position
2
.
如何预防或调整差距?也就是说,当列表项被销毁时,如何处理列表项的重新排序?
注意:我知道有一些方法可以更改位置和重新排序列表,但我不知道是否以及如何使用它们来解决问题(也许使用某种方式remove_from_list
)。
解决方案
正如您所说,您需要使用您提供的方法,您可以在控制器或模型本身中执行此操作。如果你是那种喜欢回调的人,那么:
class ListItem < ActiveRecord::Base
acts_as_list scope: [:column1_id, :column2_id], :add_new_at => :bottom
before_destroy { |record| record.remove_from_list }
....
end
有些人不喜欢将这样的逻辑作为回调处理,因此您也可以将其直接添加到您的控制器中:
class ListItemsController < Wherever
....
....
def destroy
@list_item.remove_from_list
@list_item.delete
....
end
end
我个人会将它添加到模型中,但它们都做同样的事情。
如果您需要尝试修复其中缺少记录的列表,假设您有 ID 和位置为 0-4 和 6-9 的 LineItems,缺少位置 5。您可以在控制台中进行肮脏的修复:
LineItem.where('position >= ?', 5).each { |line_item| line_item.update_attributes(position: line_item.position - 1) }
这将找到位置超过 4 的所有 LineItem,并将它们中的每一个递减 1,从而为您提供从 0 到 8 的正确排序列表。
推荐阅读
- angular - 由于某种原因没有出现 Angular 对话框窗口
- dart - 我们在flutter的dev_dependencies下添加的
- c# - 我们如何在 foreach 循环中将行分成 3 列
- android - 在 gradle 中添加 kapt androidx room 会导致数据绑定错误
- angular - Angular 工作区库 - 调试错误:无法解决条目构建错误
- c# - 我收到此错误无法将字符串隐式转换为 system.data.datatable
- c++ - How can I write a better and cleaner version of my bank account code?
- c++ - Getting errors trying to pass a vector to a class's function C++
- python - Python:每组多个统计信息
- javascript - 电脑与手机的区别