我该怎么做呢?我想通过子模型的属性对选择父模型进行排序。父模型与其子模型有很多关系。我不确定如何形成 ActiveRecord 查询来获得它。
示例:一个线程有很多帖子。我想获取由与之关联的最新帖子排序的线程集合。
我找到了一些将选择转换为数组并对该数组进行排序的解决方案,但我需要选择保留为 ActiveRecord 选择,因此我可以继续将查询链接到它。
我该怎么做呢?我想通过子模型的属性对选择父模型进行排序。父模型与其子模型有很多关系。我不确定如何形成 ActiveRecord 查询来获得它。
示例:一个线程有很多帖子。我想获取由与之关联的最新帖子排序的线程集合。
我找到了一些将选择转换为数组并对该数组进行排序的解决方案,但我需要选择保留为 ActiveRecord 选择,因此我可以继续将查询链接到它。
我需要有关数据库布局的更多信息以提供更好的示例,但是您可以加入另一个表,然后按该表排序,如下所示:
Thread.joins(:posts).order("posts.created_at").group("threads.id")
对于您的示例,简单地让孩子触摸父母会更有效:
class Thread < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :thread,
touch: true
end
每当创建或更改帖子时,这将更改 Thread 的 updated_at 列,因此该线程当时被视为已更新。在一个更复杂的示例中,您可能需要实际访问子记录,但是对于按子帖子的日期排序,当您实际上不需要该表中的信息时,这可以节省您从数据库中获取额外记录的时间。
通过仅使用普通查询,而不直接迭代数组,您可以执行以下操作:
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.