用SQL实现Rails的提前排序
我有一个用户模型,其中有一些属性,比如is_admin,is_verified,还有与其他模型的关联,比如徽章和活动 我有一个HTML表格设计,默认情况下,用户将分别按以下顺序排序:is_verified、is_admin、徽章数量、活动数量。但我不知道如何创建一个 我尝试过如下示例代码:用SQL实现Rails的提前排序,sql,ruby-on-rails,postgresql,sqlite,Sql,Ruby On Rails,Postgresql,Sqlite,我有一个用户模型,其中有一些属性,比如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|
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”]
你有什么新的方法来做这件事吗?我是个新手?非常感谢你的帮助
我有这样的样本设计:
接受多个参数,因此您可以使用如下内容:
users.order(is_verified: :desc, is_admin: :desc)
.order('badges_count DESC', 'activities_count DESC')
对于boolean
列,它们通常在数据库中存储为1
表示true
,0
表示false
,因此为desc
方向。如果您没有将这些列默认为一列或另一列(可能是false
),则可能需要调整为(即顺序(“is_verified DESC NULLS LAST”,…)
这将需要一点重构才能高效运行,依赖于徽章和活动。如果你打算定期查询这个问题,我强烈建议你把它加入。有一个很好的导游
所需的一切是:
- 新列用于
和活动\u计数
徽章\u计数
端计数器缓存:在
属于关联的上设置的true
- 计数器使用重置,即
User.reset_计数器(:徽章,:活动)
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')
如果您对它的输出感到好奇,可以调用到_sql
,以了解它实际上是如何从数据库调用数据的
试一试,让我知道你进展如何-如果你有任何问题,欢迎帮助 您可以尝试使用数据库本身进行排序,这比对加载的记录数组执行排序要快。默认情况下,如果按降序排列任何布尔字段,则布尔值为true的所有记录都将首先出现。最终的查询可能如下所示:
User.order(is_verified: :desc).order(is_admin: :desc).
left_joins(:badges).
group(:id).
order("count(badges.id) desc")
left_joins(:activities)
group(:id).
order("count(activities.id) desc")
左联接(左外部联接)包括具有零个或多个关联记录的文档。您可以在中找到详细信息
希望有帮助 非常感谢,先生。我收到了这个错误
ActiveRecord::StatementInvalid:SQLite3::SQLException:滥用聚合:COUNT()
不客气。而且啊-我想我可能错过了小组
了。。。一秒钟后,我将更新答案。联接将排除没有关联记录的记录,左侧外部联接将是正确的选择。谢谢-我已更新了答案@chronycles-更新以包括分组。“如果要选择一组记录,无论它们是否有关联的记录,可以使用left_outer_joins方法。”-链接。这意味着它将包括没有徽章的记录
/活动
;不会的。