私はレールに3つのモデル、Author、Book、Pageがあります。ページは書籍に属し、本は著者に属するものである。レールの値が最大の関連モデルをRailsクエリ
class Author < ActiveRecord::Base
has_many :books
end
class Book < ActiveRecord::Base
belongs_to :author
has_many :pages
end
class Page < ActiveRecord::Base
belongs_to :book
end
ページモデルにはpage_numberという列があります。私はPostgresを使用しています。
私の質問は次のとおりです。著者には@author
があると仮定すると、その著者の最後のページすべてをどのようにクエリしますか?言い換えれば、私はその著者によって書かれた各本の最後のページを望んでいます。私は働いていない、以下しようとしています:以下の2行が働く
Page.where(book_id: @author.books.pluck(:id)).select('MAX(page_number), *').group(:book_id)
EDIT
を、私はより速く/クリーナー溶液を学ぶのが大好きだ:
all_pages = Page.where(book: @author.books)
last_pages = all_pages.select{ |a| !all_pages.select{ |b| b.book_id == a.book_id}.any?{ |c| c.page_number > a.page_number } }
pluckではなく 'Page.where(book:@ author.books)'を使用してください。そうすれば、ActiveRecordは別のクエリでIDをフェッチするのではなく、クエリの一部としてスコープを使用できます。 – max