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