ROR /数据库:如何为数据库记录创建自定义订单列表?

时间:2012-09-07 21:14:14

标签: ruby-on-rails database

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

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

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

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

由于

2 个答案:

答案 0 :(得分:3)

您想要acts_as_list

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

执行重新排序时无法更新大量记录,但acts_as_list可以使用Article#move_to_topArticle#move_lower等方法为您完成所有这些操作。

答案 1 :(得分:0)

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

act_as_list WebsiteGitHub

这是管理数据库中有序列表的最受欢迎的选择,它在创建后10年仍然保留。它会做你想要的,并管理项目的数量。宝石将以正确的顺序将您的位置字段编号保持为1到n。但是,这意味着在列表中间插入项目意味着增加其下方列表项的所有位置值,这对您的数据库来说可能非常有用。

排名模型GitHub

此gem还可以为您管理自定义排序列表。然而,它在幕后使用另一种方法,其中列表项在整个整数值范围内获得大的位置数和间隔。如果您有大型列表并且需要经常重新排序项目,这应该会为您带来性能优势。在我看来,这个宝石可能不再被维护,因为作者现在在做Ember.js开发,它应该可以工作。 修改: It is still maintained

可排序GitHub

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

度假GitHub

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

acts_as_restful_list GitHub

这个宝石是“就像acts_as_list,但是很安静”。它似乎旨在获得更好的API。它背后的公司不再存在,所以我宁愿使用act_as_list并处理它的API,这无论如何都不错。