gpt4 book ai didi

sql - 如何在 has_many 关系中急切加载最近的对象?

转载 作者:行者123 更新时间:2023-12-04 21:45:21 25 4
gpt4 key购买 nike

我有一个 Rails 3 应用程序,其中包含类别和帖子等模型。

类别

有很多:帖子

发布

属于:类别

我希望能够显示一个类别列表,并在其旁边列出最近的帖子,而无需循环访问每个类别的数据库,并且每个类别只撤回一个帖子。

我想做这个问题提出的同样的事情 - SQL join: selecting the last records in a one-to-many relationship - 但希望使用 Active Record。

这是愚蠢的行为吗?我是否应该通过急切加载来撤回某个类别的所有帖子?我担心性能,这就是我开始研究它的原因。

最佳答案

如果不自己构建查询,我不确定这是否可行。这样做的问题是,当您开始获得所有条件或试图限制结果时,rails 处理预加载的方式并不是那么好。您可以通过创建另一个关联使包含几乎做您想做的事:

class Category < ActiveRecord::Base
has_one :last_post, :class_name => "Post", :foreign_key => "category_id", :order => "created_at desc"
end

然后就可以正常使用include了:

Category.includes(:last_post).all

但是,问题是由于生成的 sql,它仍然从类别中选择所有帖子,即使当您调用 category.last_post 时它只返回最后一篇帖子。它会生成类似这样的 sql:

SELECT `categories`.* FROM `categories`
SELECT `posts`.* FROM `posts` WHERE (`posts`.category_id IN (1,2)) ORDER BY created_at desc

关于sql - 如何在 has_many 关系中急切加载最近的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4743834/

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