Как мне написать область ActiveRecord, которая возвращает 2 недавно созданные записи, которые принадлежат их родителям?

Например, скажем, у меня есть класс 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 ответа

Все вышеприведенные ответы не соответствуют соглашениям Rails о единоличной ответственности. Единственное правильное решение - иметь такой объем книги, как у вас.

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

И запрос так:

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

Вы можете добавить его в 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)

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 = Идентификатор автора / автора Объект модели, для которого вы хотите самые последние книги.

Другие вопросы по тегам