【问题标题】:Ruby/rails sort_by not ordering properly?Ruby/rails sort_by 没有正确排序?
【发布时间】:2016-03-25 23:45:28
【问题描述】:

我有一长串 Photo 模型对象,我想按 created_at 对它们进行排序,最新的优先,然后得到一个包含前 21 张照片的新数组。

我的问题是最终的数组没有正确排序。

这是我的代码:

@recent_photos = photos.sort_by(&:created_at).reverse.first(21)

当我打印出@recent_photos 时,created_at 值的顺序如下:

1458948707
1458943713
1458947042
1458945171
...

对对象进行排序的正确方法是什么?

更新:

这是初始列表的编译方式:

photos = @user.photos
@following = @user.following
@following.each do |f|
  photos += f.photos if f.id != @user.id
end
@user.memberships.each do |group|
  photos += group.photos
end

解决方案:

问题出在问题上 - 我想按 timestamp 而不是 created_at 排序,这些是输出中的 timestamp

【问题讨论】:

  • 从我所见,排序应该可以正常工作,您的created_at 是什么类类型?
  • idk,它是由 Rails 自动生成的,但如果它是一个字符串,可能是问题?
  • 您能运行photos.map(&:created_at).first(21) 并粘贴它吗?除非我遗漏了什么,否则您的排序绝对应该是正确的。
  • 跑了,他们在那个输出中肯定是有序的
  • 您需要添加更多信息,“照片”是什么样的?它是活动记录对象的数组吗?或哈希?一个小的模拟模型应该会有所帮助。您的预期输出是什么?

标签: ruby-on-rails ruby


【解决方案1】:

您可以将其全部压缩为一个查询:

@recent_photos = Photo.where(
  user_id: @user.following_ids
).order('created_at DESC').limit(21)

您真的不希望对这些中的每一个都进行 N 次查询,因为随着一个人关注的人越来越多,它会变得越来越慢。如果他们关注 10,000 人,那么查询的数量就很可笑了。

如果您将:through 定义添加到您的模型中,您甚至可以直接查询照片:

 has_many :follower_photos,
   class_name: 'Photo',
   through: :followers

无论您的限制是什么,只要有可能,您就可以将它们归结为可以一次性查询的内容。如果这不切实际,请将其降低到可预测的查询数量,而不是 N。

【讨论】:

  • 但是如何通过相同的查询获取所有关注者照片、群组照片和个人照片?该示例仅适用于关注者
  • 理想情况下,您有一个代表个人或组的单一表,或者您为组创建存根“人”记录以解决此问题。您还可以使用单表继承 (STI) 将人员和组组合到同一个表中,或者使用多态表来连接它们,但这可能会更加混乱。理想情况下,STI 方法是最容易实现的。如果您确实有两个不同的关系,您可以使用.or(...) 方法加入它们以添加另一个条件集。
  • 出于性能原因,我倾向于尽可能避免or 的情况。 MySQL 必须做很多工作来组合两个结果集并在使用时对它们进行排序。如果您可以在 WHEREORDER BY 条件上创建索引,则使用单个表非常有效。
  • 是的,我不确定我是否可以避免or,b/c 它不应该从他们离开的组中返回此人的照片,还有其他细微差别..但无论如何,实现速度比函数 rn 的速度更重要,所以你能帮我找到一种方法来对我已经拥有的数组进行排序吗?
  • 啊,这样就行了。始终注意性能方面的考虑。你不想因为糟糕的架构设计而把自己逼到角落里。
【解决方案2】:

试试:

@recent_photos = Photo.order('created_at desc').first(21)

【讨论】:

  • 我无法直接查询Photo,b/​​c 初始照片列表是一组选定的对象,不能使用 SQL 查询
  • 啊——我现在明白了……你能说明你是如何构建对象数组的吗?
猜你喜欢
  • 1970-01-01
  • 2020-04-26
  • 2014-09-07
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多