3

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

类别

has_many :posts

邮政

属于_to:类别

我希望能够显示一个类别列表,其中列出了最近的帖子,而不需要循环访问每个类别的数据库,并且每个类别只拉回一个帖子。

我想做与这个问题相同的事情——SQL 连接:选择一对多关系中的最后一条记录——但希望使用 Active Record。

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

4

1 回答 1

3

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

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

然后您可以正常使用包含:

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
于 2011-01-20T10:18:01.360 回答