我想做类似"查找所有书籍book.pages.count< books.max_pages&#34 ;.
所以模型是:
class Book
has_many :pages
end
class Page
belongs_to :book
end
我知道我可以找到具有一定数量页面的书籍。例如:
# Get books w/ < 5 pages.
Book.joins(:pages).group("books.id").having("count(pages.id) < ?", 5)
有一个很好的方法来实现动态页面计数吗?例如:
Book.joins(:pages).group("books.id").select(.having("count(pages.id) <= book.max_pages")
如果不是,我总是可以只在Book模型中存储一些内容(例如book.is_full = false
,直到保存导致它已满),但如果max_pages更新,这就不那么灵活了。
答案 0 :(得分:2)
使用counter_cache!
http://guides.rubyonrails.org/association_basics.html 4.1.2.3:counter_cache
答案 1 :(得分:2)
您可以创建这样的范围:
def self.page_count_under(amount)
joins(:pages)
.group('books.id')
.having('COUNT(pages.id) < ?', amount)
end
<强>更新强>
如果max_pages
是Book
模型的属性,这应该有用。
def self.page_count_under_max
joins(:pages)
.group('books.id')
.having('COUNT(pages.id) < books.max_pages')
end