gpt4 book ai didi

sql - Rails 使用 SQL 提前订购

转载 作者:行者123 更新时间:2023-11-29 12:24:22 25 4
gpt4 key购买 nike

我有用户模型,它有一些属性,如 is_admin、is_verified,并且还与其他模型(如徽章和事件)相关联。

我有 HTML 表格设计,默认情况下,用户将分别按 is_verified、is_admin、徽章数量和事件数量排序。但我不知道如何创建一个。

我试过这样的示例代码:

users = User.all.limit(10)
users.order(is_verified: :true).order(is_admin: :true).order(users.map{|user| user.badges.count}).order(users.map{|user| user.activites.count})

但这行不通,因为命令只接受 :asc, :desc, :ASC, :DESC, "asc", "desc", "ASC", "DESC"]

你有什么新方法可以做到这一点,我是新手查询吗?非常感谢您的帮助。

我有这样的样本设计: enter image description here

最佳答案

order接受多个参数,因此您可以使用如下内容:

users.order(is_verified: :desc, is_admin: :desc)
.order('badges_count DESC', 'activities_count DESC')

对于 boolean 列,它们通常在数据库中存储为 1 for true0对于 false,因此是 desc 方向。如果您没有将这些列默认为一个或另一个(可能是 false),您可能需要调整为(即)order("is_verified DESC NULLS LAST", ...)

这需要一些重构才能有效运行,依赖于 counter_caches用于徽章和事件。如果您要定期查询此内容,我强烈建议您添加此内容。有一个很好的指南 here .

所有需要的是:

  • activities_countbadges_count 的新列
  • counter_cache: true 在关联的 belongs_to 端设置
  • 使用 this method 重置计数器,即 User.reset_counters(:badges, :activities)

否则原样,您可以使用:

User.left_joins(:badges, :activities)
.order(is_verified: :desc, is_admin: :desc)
.group("badges.id", "activities.id")
.order('COUNT(badges.id) DESC', 'COUNT(activities.id) DESC')

如果您对它的输出感到好奇,您可以调用 to_sql 来了解它实际上是如何从数据库中调用数据的。

试一试,让我知道您的进展情况 - 如果您有任何问题,我们很乐意为您提供帮助!

关于sql - Rails 使用 SQL 提前订购,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com