如何编写ActiveRecord范围,该范围返回最近创建的2条属于其父级的记录?

时间:2018-07-23 02:36:58

标签: sql ruby-on-rails activerecord scope activerecord-relation

例如,假设我有一个Author类和一个Book类。如何为(属于其作者)的最新创建记录创建范围?

我知道最近创建的图书的范围是

scope :most_recent, -> { order(created_at: :desc).limit(4) }

但是,这将返回任何作者最近创建的书籍。

我正在寻找类似的东西

author 1: Plato

id | title | created_at 1 | Apology | 23 Jul 2018 2 | Phaedo | 24 Jul 2018 3 | Republic | 25 Jul 2018

author 2: Seneca

id | title | created_at 4 | Oedipus | 3 May 2018 5 | Agamemnon | 4 May 2018 6 | Hercules | 5 May 2018

返回Hercules, Agamemnon, Republic, and Phaedo

3 个答案:

答案 0 :(得分:1)

以上所有答案均未遵循单一责任的Rails约定。唯一正确的答案就是拥有像您一样拥有这本书的范围!

class Book
  scope :most_recent, -> { order(created_at: :desc).limit(4) }
end

然后这样查询:

# for author with ID=3
Author.find(3).books.most_recent 

答案 1 :(得分:0)

您可以像这样在Book类中添加它:

scope: most_recent_by_author, ->(author_id) { where(author_id: author_id).order(created_at: :desc).limit(2) }

要查询:

Book.most_recent_by_author(1)

答案 2 :(得分:0)

scope :most_recent, lambda { |*args|joins(:author).where(books:{:author_id=>args}).order('books.created_on DESC').limit(2) }

在您的书籍模型中写入以上范围。 要通过任何作者查询最新书籍,请执行以下操作:

Book.most_recent(author_id)

author_id =您要为其获取最新书籍的作者/作者模型对象的ID。