【问题标题】:Rails how to sort records from database in a specific order? [duplicate]Rails如何按特定顺序对数据库中的记录进行排序? [复制]
【发布时间】:2014-12-02 22:08:46
【问题描述】:

我在 URL 中有一些参数代表 ID。在这个页面上,我打印出一个文章列表——通常在 50 到 70 之间。

在 URL 中是 ID - 比如说 - 这种格式:website.com/mark/articles/10/12/13/20(文章 ID:10、12、13、20)。

我会将这些 ID 保存到一个数组中,并在打印页面上所有 Mark 的文章时,我需要按照 ID 为 10121320 的文章对文章进行排序将在列表的顶部。

如何实现这样的目标?

【问题讨论】:

  • 你只显示这四篇文章吗?如果不是,辅助排序键是什么?
  • 我正在显示所有文章,以及上面的 4 篇文章。

标签: ruby-on-rails ruby arrays sorting


【解决方案1】:

对于 SQL 解决方案,请查看 mu 的答案。使用 Ruby:

articles = Article.where(id: ids).index_by(&:id).values_at(*ids) +
  Article.where.not(id: ids)

当然,如果您需要Relation 而不是Array,SQL 解决方案会更好。

【讨论】:

  • 感谢@tokland 的回答,但这只会显示URL 中具有指定ID 的文章。我需要显示所有文章并按 URL 中的文章排序(URL 中的文章位于文章列表的开头)
【解决方案2】:

有两种方法可以做到这一点。普通的 ruby​​ 或 SQL。

普通的 ruby​​ 版本可能更容易理解,也不容易受到可能的 SQL 注入:

article_ids_on_top = [10, 12, 13, 20]
articles = Article.all
top_articles = articles.select{|article| article_ids_on_top.include?(article.id) }
bottom_raticles = articles.reject{|article| article_ids_on_top.include?(article.id) }

@articles = top_articles + bottom_articles

SQL 版本:

article_ids_on_top = [10, 12, 13, 20]
@articles = Article.order("FIELD(id, [#{article_ids_on_top.join(',')})")

【讨论】:

  • FIELD 不是 MySQL 主义吗?
  • @Milan 感谢您的回答。当我尝试SQL版本时,它返回错误使用括号[]错误,如果我不使用括号,错误消失了,但数据没有正确排序。
猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多