Rails gem acts_as_list: 当列表项被销毁时,如何处理列表项的重新排序?
Rails gem acts_as_list: How to handle reordering of list items when a list item is destroyed?
我正在这样使用 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
是 1
、column2_id
是 11
和 column3_id
是 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
然而,当@list_item
被销毁时,假设column1_id
是1
,column2_id
是11
和column3_id
是56
(记录id751
),那么数据库看起来如下:
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
.
有差距
如何防止或调整差距?即,当列表项被销毁时,如何处理列表项的重新排序?
注:我知道有methods that change position and reorder list但不知道有没有
以及如何使用它们来解决问题(也许使用某种方式 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 的 LineItem,但缺少位置 5。您可以进行较差的修复在控制台中:
LineItem.where('position >= ?', 5).each { |line_item| line_item.update_attributes(position: line_item.position - 1) }
这将找到所有位置超过 4 的 LineItem,并将它们中的每一个减一,从而为您留下一个从 0-8 正确排序的列表。
我正在这样使用 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
是 1
、column2_id
是 11
和 column3_id
是 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
然而,当@list_item
被销毁时,假设column1_id
是1
,column2_id
是11
和column3_id
是56
(记录id751
),那么数据库看起来如下:
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
.
如何防止或调整差距?即,当列表项被销毁时,如何处理列表项的重新排序?
注:我知道有methods that change position and reorder list但不知道有没有
以及如何使用它们来解决问题(也许使用某种方式 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 的 LineItem,但缺少位置 5。您可以进行较差的修复在控制台中:
LineItem.where('position >= ?', 5).each { |line_item| line_item.update_attributes(position: line_item.position - 1) }
这将找到所有位置超过 4 的 LineItem,并将它们中的每一个减一,从而为您留下一个从 0-8 正确排序的列表。