【问题标题】:Sorting users in Rails based on values in array attribute of user model根据用户模型数组属性中的值对Rails中的用户进行排序
【发布时间】:2016-10-10 14:21:22
【问题描述】:

我有一个用户模型,里面有一个数组。该数组用于存储用户在各种活动中获得的分数。基本上是这样的:

<ActiveRecord::Relation [#<User id: 1, fullname: "Kaja Sunniva Edvardsen", points: [0, 4170, 3860, 2504, 2971, 3859, 4346]>, #<User id: 2, fullname: "Alexander Lie Sr.", points: [0, 3273, 3681, 2297, 2748, 4202, 3477]>]>

我想按点数组中的不同值对所有用户进行排序,以便能够为每个不同的活动创建排名列表,点 [0]、点 [1] 等...

按点排序[1]应该首先返回Kaja,4170>3273,按点排序[6]应该把Alexander放在首位,4202>3859

我该怎么做?

【问题讨论】:

  • 您到底想要排序什么?用户或积分或?你如何排序 - 什么是“不同的价值观”?你能给出预期的结果吗?
  • 我想按数组中的值对用户进行排序。像 OrderBy(points[1]) 这样的东西不起作用。我想要的结果是 Kaja 第一和 Alexander 第二,因为 Kajas 点 [1] 值更高,4170 vs 3273
  • 什么是模型定义和用户迁移?你究竟是如何在 db 中存储一个数组的?
  • 另外,您是否绝对需要在 DB 中排序,或者您可以将所有对象加载到 Rails 并在那里排序?每个排序组将有多少个对象?只是想如果有比赛或按分数对用户进行排序的事情,每个比较组不应该有太多用户(最多数千?而不是数百万)
  • 我使用 ActiveRecord 的序列化声明将其存储在用户模型中:序列化 :points 迁移:change_column :users, :points, :text, :default => [0]

标签: mysql sql ruby-on-rails sorting


【解决方案1】:

据我所知,MySQL 没有集成数组类型。

假设你有这样的模型:

class User < ActiveRecord::Base
  # ...
  serialize :points, Array
  # ...
end

您无法使用order 查询进行排序,但您可以尝试另一种解决方案(效率较低),将资源作为数组处理:

User.all.sort { |user1, user2| user2.points[1] <=> user1.points[1] }

这将返回一个数组而不是 ActiveRecord 查询。另外,请记住,此代码不会处理 nil 值(即,如果用户在 points 中只有 2 个元素怎么办?)。

【讨论】:

  • 谢谢,是的,我的模型看起来像那样。我明白了,当我现在测试这个时,我得到了 ArgumentError:用户与用户的比较失败,但我会再试一试。看起来我会在 Rails 中对其进行排序,所以很高兴知道。
  • 你能告诉我们你当前的查询以找到调试吗? :]
  • 我刚刚错过了一个 nil 值。它可以满足我的要求,感谢您的帮助!
猜你喜欢
  • 2020-07-09
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多