1

我有一个包含一些文章(用于网站)的数据库表,如下所示:

Articles:
id       title         order_id
1          -            1
2          -            4
3          -            3
4          -            2

现在在网页上我想使用 order_id 来订购文章,这非常好,使用 ROR 活动记录。

但是,当我想更新 order_id 时,我必须使用这种技术更新所有记录,每次更改 order_id 时。这样做的更好方法是什么?

谢谢

4

2 回答 2

3

你想要acts_as_list

class Article < ActiveRecord::Base
  acts_as_list :column => 'order_id'
end

当您执行重新排序时,没有办法更新大量记录,但是acts_as_list 可以使用 和 之类的方法为您完成所有这些Article#move_to_top工作Article#move_lower

于 2012-09-07T21:23:43.660 回答
0

有一些宝石可以解决您的问题。Ruby 工具箱将它们放在Active Record Sortables类别中。截至撰写本文时(2017 年 3 月),此列表中的顶级宝石是:

act_as_list (网站, GitHub )

这是在数据库中管理有序列表的最流行的选择,并且在创建 10 年后仍然保持不变。它会做你想做的事并管理项目的数量。gem 会以正确的顺序保持您的位置字段编号从 1 到 n。然而,这意味着在列表中间插入项目意味着增加其下方列表项目的所有位置值,这对您的数据库来说可能是相当多的工作。

排名模型( GitHub )

该 gem 还为您管理自定义排序列表。然而,它在幕后使用了另一种方法,您的列表项在整个整数值范围内获得很大的位置编号并且间隔开。如果您有大量列表并且需要经常重新排序项目,这应该会给您带来性能优势。在我看来,这个 gem 可能不再被维护,因为作者现在正在进行 Ember.js 开发,但它应该可以工作。编辑: 它仍然被维护

可排序GitHub

这似乎与 act_as_list 相同,但能够将您的项目放入多个列表中。我不确定这是否是一个有效的用例,因为您可以只创建多个项目。看起来它没有维护很长时间,也没有被很多人使用。

度假村( GitHub )

这个gem 使用链表方法,即每个数据库条目都有一个指向下一个条目的指针。如果您需要在列表中间进行大量插入,这可能是一个好主意,但对于仅获取整体列表或者如果数据库中出现问题并且链中断,这似乎是一个糟糕的主意。它很新,所以让我们看看它是如何发展的。

act_as_restful_list ( GitHub )

这个宝石是“就像acts_as_list,但很安静”。它似乎旨在提供更好的 API。它背后的公司已经不存在了,所以我宁愿使用act_as_list来处理它的API,反正也不错。

于 2017-03-18T19:01:34.950 回答