Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用SQL实现Rails的提前排序_Sql_Ruby On Rails_Postgresql_Sqlite - Fatal编程技术网

用SQL实现Rails的提前排序

用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|

我有一个用户模型,其中有一些属性,比如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”]

你有什么新的方法来做这件事吗?我是个新手?非常感谢你的帮助

我有这样的样本设计:

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

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方法。”-链接。这意味着它将包括没有
徽章的记录
/
活动
;不会的。