Ruby on rails Rails Arel,包含的计数值?

Ruby on rails Rails Arel,包含的计数值?,ruby-on-rails,arel,Ruby On Rails,Arel,我主要习惯于编写简单的sql语句,但我想更好地理解arel。基本上,我可以做什么来计算:include的内容 Category.includes(:discussions) 这是我的讨论,然后有很多评论。我需要知道如何计算类别模型的评论 抱歉,如果这是显而易见的,并感谢任何帮助提前 编辑:针对类别而非讨论的计数进行更新。通常,您可以在任何具有多个关联的上使用\count方法来获取计数。例如: Category.find(1, :include => :discussions).discu

我主要习惯于编写简单的sql语句,但我想更好地理解arel。基本上,我可以做什么来计算:include的内容

Category.includes(:discussions)
这是我的讨论,然后有很多评论。我需要知道如何计算类别模型的评论

抱歉,如果这是显而易见的,并感谢任何帮助提前


编辑:针对类别而非讨论的计数进行更新。

通常,您可以在任何
具有多个关联的
上使用
\count
方法来获取计数。例如:

Category.find(1, :include => :discussions).discussions.first.comments.count
编辑:

计算特定类别的所有评论的“暴力”方法:

category = Category.find(1, :include => { :discussions => :comments })    # Check that this eager loading doesn't cause unnecessary overhead.
count = 0
category.discussions.map{|d| count += d.comments.count}
请注意,这将创建N+1个查询,因此可能不是性能选项。另一种方法是在讨论模型上设置一个,然后改为:

category = Category.find(1, :include => :discussions)
count = 0
category.discussions.map{|d| count += d.comments_count}
编辑(2):


您可以使用
数组#inject
方法进一步简化求和位。请参见此处的示例:

通常,您可以对任何具有多个关联的
使用
#count
方法来获取计数。例如:

Category.find(1, :include => :discussions).discussions.first.comments.count
编辑:

计算特定类别的所有评论的“暴力”方法:

category = Category.find(1, :include => { :discussions => :comments })    # Check that this eager loading doesn't cause unnecessary overhead.
count = 0
category.discussions.map{|d| count += d.comments.count}
请注意,这将创建N+1个查询,因此可能不是性能选项。另一种方法是在讨论模型上设置一个,然后改为:

category = Category.find(1, :include => :discussions)
count = 0
category.discussions.map{|d| count += d.comments_count}
编辑(2):


您可以使用
数组#inject
方法进一步简化求和位。请看这里的例子:

我远非Arel专家,但我的直觉是,在计算过程中,至少需要一点手动操作。以下是如何最大限度地利用arel获得每个类别的计数:

Category.joins(:discussions => :comments).group('categories.id').select('categories.id, COUNT(*) as cnt')

请注意,您不会加载类别的完整模型,但我认为这是获取完整计数列表的最快方法。我不确定你还可以用arel做什么,但我认为这是最快的查询。根据您的具体应用,您可能希望做一些不同的事情。

我远不是Arel专家,但我的直觉是,您必须在计算中至少获得一点手动操作。以下是如何最大限度地利用arel获得每个类别的计数:

Category.joins(:discussions => :comments).group('categories.id').select('categories.id, COUNT(*) as cnt')

请注意,您不会加载类别的完整模型,但我认为这是获取完整计数列表的最快方法。我不确定你还可以用arel做什么,但我认为这是最快的查询。根据您的具体应用,您可能希望做一些不同的事情。

请详细说明您的型号好吗?它是一个有很多讨论有很多评论的类别吗?你想得到一个类别的评论总数吗?你能详细说明一下你的模型吗?它是一个有很多讨论有很多评论的类别吗?你想得到一个类别的评论总数吗?很抱歉,从我最初的解释来看,这是正确的,我想做的是计算整个类别的评论,而不仅仅是第一次讨论。这在问题中并不清楚。你问:“我需要知道如何计算讨论模型的评论。”因此,我对问题本身的澄清发表了评论。感谢所有的建议,我认为为了节省请求,我可以在表中使用post计数,并进行一些测试。category.comments.count起初不起作用,不确定原因,但现在起作用了。我也将尝试实施您的解决方案并比较性能。谢谢很抱歉,从我最初的解释来看,这是正确的。我想做的是从整体上计算类别的评论,而不仅仅是第一次讨论。这在问题中并不清楚。你问:“我需要知道如何计算讨论模型的评论。”因此,我对问题本身的澄清发表了评论。感谢所有的建议,我认为为了节省请求,我可以在表中使用post计数,并进行一些测试。category.comments.count起初不起作用,不确定原因,但现在起作用了。我也将尝试实施您的解决方案并比较性能。谢谢谢谢你的意见,我也会尝试一下。很难找到做到这一点的“最佳”方法!谢谢你的意见,我也会尝试一下。很难找到做到这一点的“最佳”方法!