用户has_many Books。我想为只为每个user_id返回最新(created_at)书籍的Books添加一个范围。通过user_id对书籍进行分组并且只为每个user_id获取最新内容的东西?
为了澄清,我在技术上可以这样做:
User.all.each { |user| user.books.first }
但是我想用干净的Active Record查询来做这件事。我很难搞清楚,但我想解决方案并不复杂。
答案 0 :(得分:1)
最简单的方法是在书籍上创建一个范围,使用子查询只选择其用户拥有的最新书籍:
class Book < ActiveRecord::Base
belongs_to :user
scope :most_recent, -> {
where('NOT EXISTS(SELECT 1 FROM books b2 WHERE b2.user_id = books.user_id AND b2.created_at > books.created_at)')
}
end
这只是众多选项中的一种,但它可能是最可重复使用的,因为您可以将这种关系加入到其他关系中,而不必担心您的聚合会发生冲突。