我想做一些像"查找所有book.pages.count <books.max_pages"。>
所以模型是:
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得到更新,这就不那么灵活了。
你可以这样创建一个作用域:
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
使用counter_cache!
http://guides.rubyonrails.org/association_basics.html 4.1.2.3:counter_cache