我有一个 Rails 3 应用程序,其中包含类别和帖子等模型。
类别
has_many :posts
邮政
属于_to:类别
我希望能够显示一个类别列表,其中列出了最近的帖子,而不需要循环访问每个类别的数据库,并且每个类别只拉回一个帖子。
我想做与这个问题相同的事情——SQL 连接:选择一对多关系中的最后一条记录——但希望使用 Active Record。
这是一件愚蠢的事情吗?我是否应该通过急切加载来撤回某个类别的所有帖子?我担心性能,这就是我开始研究这个的原因。
我有一个 Rails 3 应用程序,其中包含类别和帖子等模型。
类别
has_many :posts
邮政
属于_to:类别
我希望能够显示一个类别列表,其中列出了最近的帖子,而不需要循环访问每个类别的数据库,并且每个类别只拉回一个帖子。
我想做与这个问题相同的事情——SQL 连接:选择一对多关系中的最后一条记录——但希望使用 Active Record。
这是一件愚蠢的事情吗?我是否应该通过急切加载来撤回某个类别的所有帖子?我担心性能,这就是我开始研究这个的原因。
如果不自己建立查询,我不确定这是否可行。这样做的问题是,当您开始获得条件或尝试限制结果时,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