Sql Rails 4-对关联计数的查询大于属性
我想在book.pages.countSql Rails 4-对关联计数的查询大于属性,sql,ruby-on-rails,Sql,Ruby On Rails,我想在book.pages.count
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.is_full=false,直到保存导致它满为止,但是如果max_pages得到更新,这就有点不灵活了。使用计数器缓存
4.1.2.3:计数器缓存您可以创建如下范围:
def self.page_count_under(amount)
joins(:pages)
.group('books.id')
.having('COUNT(pages.id) < ?', amount)
end
这本书的最大页数是什么。最大页数?最大页数来自哪里?您试图引用的是实例还是类方法/属性?我需要图书模型定义的数量,因此它会针对每本书而改变,而不仅仅是针对一个查询,我想一次找到所有这样的书。值得一提的是,只对books.id进行分组只对某些数据库有效。哦,在某些数据库中使用countpages可能会稍微有效一些。book_id<。。。因为只访问book_id列上的索引可以避免表访问。我没有意识到这个问题,所以感谢您提出这个问题。当使用books.id而不是pages.book_id时,是否真的会对性能产生那么大的影响,或者说这是可以忽略的?我会尽量记住这些想法,以备将来参考。我感谢最新的回复。我还没有测试它,因为我最终学习了Enough关于计数器缓存的知识,使它们工作起来,并且它真的简化了事情。谢谢!我添加了一个编辑,显示了一个例子,以防其他人无意中看到这篇文章。
def self.page_count_under_max
joins(:pages)
.group('books.id')
.having('COUNT(pages.id) < books.max_pages')
end