【发布时间】:2017-05-11 04:38:00
【问题描述】:
我在 rails 中有 3 个模型:作者、书籍和页面。页面属于书籍,书籍属于作者:
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 模型有一个名为 page_number 的列。我正在使用 Postgres。
我的问题是:假设有作者@author,如何查询该作者的所有最后一页?换句话说,我想要那个作者写的每本书的最后一页。我正在尝试以下不起作用:
Page.where(book_id: @author.books.pluck(:id)).select('MAX(page_number), *').group(:book_id)
编辑
以下 2 行有效,但我很想了解更快/更清洁的解决方案:
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 } }
【问题讨论】:
-
使用
Page.where(book: @author.books)而不是采摘。这样,ActiveRecord 可以将范围用作查询的一部分,而不是在单独的查询中获取 id。
标签: sql ruby-on-rails postgresql activerecord