我一直在寻找最好的方法来做到这一点,结果平庸,所以我决定在这里问。
场景如下:我有三个模型,任务、用户和评论,基本上看起来像这样:
class Task < ActiveRecord::Base
belongs_to :user
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :task
end
class User < ActiveRecord::Base
has_many :tasks
has_many :comments
end
我正在尝试输出一个任务列表(假设这个问题的目的是最后 10 个),并为每个任务关联最后一条评论,并且它的作者(用户模型)具有最少的查询可能。
谢谢
更新:我结合了 Blue Smith 和 harigopal 的解决方案,因此解决方案如下所示:
class Task < ActiveRecord::Base
belongs_to :user
has_many :comments
has_one :last_comment, -> { order 'created_at' }, class_name: "Comment"
end
然后获取这样的评论:
tasks = Task.joins(last_comment: :user)
.includes(last_comment: :user)
.order('tasks.created_at DESC').limit(10).load
它只产生一个查询,这正是我想要的!谢谢!