0

我想使用gemacts_as_list来重新排序列表。

但它似乎没有比基于关联处理更多的受限查询(我想基于关联和布尔属性设置为的对象来排序列表true)。

如果我没记错的话,通过查看日志,gem 似乎正在使用一条同时更新许多记录的 SQL 语句。

我想使用完全相同的语句来考虑我自己的自定义订购代码。

以下两个语句将问题对象从位置 3 移动到 8。

UPDATE "questions" SET position = (position - 1) WHERE ("questions"."question_list_id" = 2 AND position > 3 AND position <= 8)
UPDATE "questions" SET "position" = ?, "updated_at" = ? WHERE "questions"."id" = 55  [["position", 8], ["updated_at", "2014-06-09 14:40:47.545040"]]

是否可以使用 ActiveRecord 或任何其他方式,如果可以,如何重用上述代码?

4

1 回答 1

1

您可以混合使用 SQL 和 ActiveRecord 来实现这些 SQL 语句。它们可以写成:

Question.where(question_list_id: 2, position: [4..8]).update_all('position = (position - 1)')
Question.update(55, position: 8)

act_as_list gem 不负责对元素进行排序,它只是将元素的位置保存在数据库中。您可以使用 act_as_list 提供的 API 对元素进行排序。

scope如果您只想针对某些元素,还有一个选项。见

于 2014-06-09T16:36:30.607 回答