Rails&活动记录:创建范围以获取最新的孩子

时间:2015-12-18 20:46:35

标签: ruby-on-rails activerecord

用户has_many Books。我想为只为每个user_id返回最新(created_at)书籍的Books添加一个范围。通过user_id对书籍进行分组并且只为每个user_id获取最新内容的东西?

为了澄清,我在技术上可以这样做:

User.all.each { |user| user.books.first }

但是我想用干净的Active Record查询来做这件事。我很难搞清楚,但我想解决方案并不复杂。

1 个答案:

答案 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

这只是众多选项中的一种,但它可能是最可重复使用的,因为您可以将这种关系加入到其他关系中,而不必担心您的聚合会发生冲突。