0

我想从一系列帖子中提取最新的帖子。但是由于某种原因,使用.first会搞砸它。对于一些人来说,它正在拉动最新的,而对于一些人来说,它正在拉动最古老的。

我有:default_scope order: posts.created_at DESC

所以首先应该给我最新的帖子,但有时不会。有没有更好的方法来获取最新的帖子?

更新

这是我的控制器代码:

@users = User.includes(:ideas).order('users.updated_at DESC')

我想按最后更新的 DESC 对用户进行排序,然后为每个用户显示他最近的帖子。我认为default_scope order: posts.created_at DESC.order('users.updated_at DESC')

在我看来,我正在做:

@users.each do |user| post = user.posts.first end

它工作不正常。如何在没有 N+1 问题的情况下解决此问题?

4

4 回答 4

1

id如果它是增量的,您可以排序:

scope :latest, -> { order('id DESC') }
Post.latest.first 
Post.latest.limit(10)

这里关系数据库的另一个好处是已经有一个关于 id 的索引。

于 2013-09-10T10:13:22.427 回答
1

由于某种原因,默认范围内的 order 子句被覆盖。

您可以使用reorder强制排序:

Post.reorder(created_at: :desc).first

在命名范围内使用它:

class Post < ActiveRecord::Base
  scope :latest, -> { reorder(created_at: :desc).first }
end

参考资料: reorderon Rails API

编辑更新的问题

默认范围定义如下post.rb

default_scope { order(created_at: :desc) }

你可以简单地写:

@posts = Post.includes(:user).group('posts.user_id')

您将获得最新的帖子(每个用户一个)

如果某些帖子没有用户:

@posts = Post.joins(:user).select('posts.*, users.username AS user_username, etc........').group('posts.user_id')

的每个帖子@posts都会得到一个user_username没有n+1问题的方法。您当然可以根据需要定义更多自定义方法。

于 2013-09-10T10:15:12.017 回答
0

如果

 Post.first(:order => 'created_at DESC')

不起作用(或者您对最近更新的内容感兴趣)某处有问题...

于 2013-09-10T10:13:05.443 回答
0

它应该是这样的:

Post.order('created_at DESC').first
于 2013-09-10T10:39:32.517 回答