3

我该怎么做呢?我想通过子模型的属性对选择父模型进行排序。父模型与其子模型有很多关系。我不确定如何形成 ActiveRecord 查询来获得它。

示例:一个线程有很多帖子。我想获取由与之关联的最新帖子排序的线程集合。

我找到了一些将选择转换为数组并对该数组进行排序的解决方案,但我需要选择保留为 ActiveRecord 选择,因此我可以继续将查询链接到它。

4

3 回答 3

5

我需要有关数据库布局的更多信息以提供更好的示例,但是您可以加入另一个表,然后按该表排序,如下所示:

Thread.joins(:posts).order("posts.created_at").group("threads.id")
于 2013-07-30T21:05:30.163 回答
5

对于您的示例,简单地让孩子触摸父母会更有效:

class Thread < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :thread,
        touch: true
end

每当创建或更改帖子时,这将更改 Thread 的 updated_at 列,因此该线程当时被视为已更新。在一个更复杂的示例中,您可能需要实际访问子记录,但是对于按子帖子的日期排序,当您实际上不需要该表中的信息时,这可以节省您从数据库中获取额外记录的时间。

于 2013-07-31T15:20:34.160 回答
0

通过仅使用普通查询,而不直接迭代数组,您可以执行以下操作:

Post.joins(:thread).includes(:thread).order("posts.created_at").group("thread_id").take(5) 
# Maybe you can take only a few samples of your collection to show on Last Posted Topics, 
# then you just replace take(5) with the number of posts you want to take.
于 2013-07-30T21:14:34.537 回答