Ruby on rails Ruby/rails是否通过不正确排序来排序?

Ruby on rails Ruby/rails是否通过不正确排序来排序?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个很长的照片模型对象数组,我想按照在处创建的对它们进行排序,首先是最新的,然后得到一个包含前21张照片的新数组 我的问题是最终数组的顺序不正确 这是我的密码: @recent_photos = photos.sort_by(&:created_at).reverse.first(21) 当我打印出@最近的照片时在处创建的值的顺序如下: 1458948707 1458943713 1458947042 1458945171 ... 对对象进行排序的正确方法是什么 更新: 以下是初

我有一个很长的
照片
模型对象数组,我想按照
处创建的
对它们进行排序,首先是最新的,然后得到一个包含前21张照片的新数组

我的问题是最终数组的顺序不正确

这是我的密码:

@recent_photos = photos.sort_by(&:created_at).reverse.first(21)
当我打印出
@最近的照片时
处创建的
值的顺序如下:

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
解决方案:

问题在于这个问题-我想按
时间戳
排序,而不是在
处创建的
,这些是输出中的
时间戳

尝试:

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

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

@recent_photos = Photo.where(
  user_id: @user.following_ids
).order('created_at DESC').limit(21)
你真的不想对每一个都进行N次查询,因为当一个人跟踪的人越来越多时,查询速度会越来越慢。如果他们跟踪10000人,那么查询的数量就太多了

如果在模型中添加
:通过
定义,您甚至可以直接查询照片:

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

无论您的约束是什么,只要有可能,将它们归结为您可以一次查询的内容。如果这不实用,请将其归结为可预测的查询数量,永远不要N.

我无法直接查询
照片,b/c初始照片列表是一组选定的对象,无法使用SQLah进行查询--我现在明白了…你能展示一下你是如何构建对象数组的吗?但我如何获得所有追随者的照片、组照片,和个人照片有相同的问题吗?该示例仅适用于followers通常您有一个表示个人或组的单数表,或者您为组创建存根“person”记录来解决此问题。您还可以使用单表继承(STI)将person和group组合到同一个表中,或者使用多态表将它们连接起来,但这可能会非常混乱。理想情况下,STI方法最容易实现。如果确实有两个不同的关系,可以使用
或(…)
方法将它们连接起来,以添加另一个条件集。出于性能原因,我倾向于尽可能避免出现
情况。MySQL需要做大量的工作来组合两个结果集并对它们进行排序。如果你可以在
WHERE
ORDER BY
标准上建立索引,那么使用单个表是非常高效的。是的,我不确定我是否可以避免
,b/c它不应该返回他们离开的组中的照片,还有其他细微差别。。但是无论如何,实现的速度比函数rn的速度更重要,所以你能帮我找到一种方法来对我已有的数组进行排序吗?啊,这样就可以了。始终稍微注意性能方面的考虑。你不想因为糟糕的模式设计而陷入困境。从我所看到的排序应该可以很好地工作,你在
创建的
类是什么类型的?idk,它是由Rails自动生成的,但如果是字符串可能会出问题?你能运行
photos.map(&:created_at)。首先(21)
并粘贴它吗?除非我遗漏了什么,否则你的排序应该是正确的。运行它,它们在输出中肯定是有序的。你需要添加更多的信息,“照片”是什么样子的?它是活动记录对象的数组吗?还是散列?一个小的模拟模型应该会有所帮助。你的预期产出是多少?