Ruby / rails sort_by没有正确排序?

时间:2016-03-25 23:45:28

标签: ruby-on-rails ruby

我有一长串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

2 个答案:

答案 0 :(得分:4)

你可以把它全部压缩成一个查询:

@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.

答案 1 :(得分:3)

尝试:

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