Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails 4-对关联计数的查询大于属性_Sql_Ruby On Rails - Fatal编程技术网

Sql Rails 4-对关联计数的查询大于属性

Sql Rails 4-对关联计数的查询大于属性,sql,ruby-on-rails,Sql,Ruby On Rails,我想在book.pages.count

我想在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