gpt4 book ai didi

ruby-on-rails - 在 Rails 中获取最近的相关记录

转载 作者:行者123 更新时间:2023-11-29 12:38:11 26 4
gpt4 key购买 nike

我一直在寻找最好的方法来做到这一点,但结果平平,所以我决定在这里问问。

场景如下:我有三个模型,Task、User 和 Comment,它们基本上是这样的:

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 个),并为每个任务及其作者(用户模型)关联 last comment 尽可能少的查询

谢谢

更新:我结合了 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

只产生一个查询,这正是我要找的!谢谢!

最佳答案

您必须连接表,并预先加载数据以最大程度地减少查询次数。

例如:

tasks = Task.joins(comments: :user)
.includes(comments: :user)
.order('tasks.created_at DESC')
.limit(10).load

comments = tasks.first.comments # No query, eager-loaded
user = comments.first.user # No query, eager-loaded

这应该会将查询数量减少到一个(非常复杂的一个),因此您必须确保您的索引符合要求! :-D

关于组合联接和包含的官方文档含糊不清,但应该有所帮助:http://guides.rubyonrails.org/active_record_querying.html#joining-multiple-associations

编辑:

这是一个演示应用程序,其模型与您使用上述方法执行预加载的模型相同。它使用两个查询 来加载数据。启动该应用程序以查看它的运行情况。

https://github.com/harigopal/activerecord-join-eager-loading

关于ruby-on-rails - 在 Rails 中获取最近的相关记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17501742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com