Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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
Ruby on rails 使用时返回的准确总和的模型总和:包括(rails 2.3.8)_Ruby On Rails_Ruby_Postgresql_Activerecord - Fatal编程技术网

Ruby on rails 使用时返回的准确总和的模型总和:包括(rails 2.3.8)

Ruby on rails 使用时返回的准确总和的模型总和:包括(rails 2.3.8),ruby-on-rails,ruby,postgresql,activerecord,Ruby On Rails,Ruby,Postgresql,Activerecord,我一直有个问题,我就是想不起来。我需要获取对象中属性“视图”的和,但是,当使用:include时,我得到的和非常不准确 >> c = Category.find 181 >> c.pages.sum(:views, :include => [:tags, :author], :conditions => q) => 48448 如果删除:include,则得到正确的总和 >> c.pages.sum(:views, :conditions

我一直有个问题,我就是想不起来。我需要获取对象中属性“视图”的和,但是,当使用:include时,我得到的和非常不准确

>> c = Category.find 181
>> c.pages.sum(:views, :include => [:tags, :author], :conditions => q)
=> 48448
如果删除:include,则得到正确的总和

>> c.pages.sum(:views, :conditions => q)
=> 11991
两个查询中的页数相同,因此我不知道为什么该值会有任何不同。浏览每一页也可以

>> c.pages.find(:all, :include => [:tags, :author], :conditions => q).each {|p| a += p.views}; a
=> 11991
:tags和:author没有:views属性或任何远程类似的属性,甚至在pages.views中指定该属性也会产生相同的结果

不幸的是,我需要通过数据库获取该值,以便快速生成视图的图形。条件中使用的q变量是过滤器,原因是需要:include。我不明白是什么导致了这一点,也不知道48448的值是从哪里来的

我非常感谢您在这方面的帮助,并提前表示感谢。

假设情况如此

pages
id|name    |views
1 |my_page |10

tags
id|name   |page_id
1 |my_tag1|1
2 |my_tag2|1
使用

您正在复制id为1的页面两次:

result
pages.id|pages.name|pages.views|tags.id|tags.name|tags.page_id
1       |my_page   |10         |1      |my_tag1  |1
1       |my_page   |10         |2      |my_tag2  |1
此结果集的列页数和视图数为20而不是10

[已编辑]

使用:include重写的查询

c.pages.sum(:views, :conditions => ["id in (select distinct tags.page_id from tags where tags.id in (?))", tag_ids]
假设情况

pages
id|name    |views
1 |my_page |10

tags
id|name   |page_id
1 |my_tag1|1
2 |my_tag2|1
使用

您正在复制id为1的页面两次:

result
pages.id|pages.name|pages.views|tags.id|tags.name|tags.page_id
1       |my_page   |10         |1      |my_tag1  |1
1       |my_page   |10         |2      |my_tag2  |1
此结果集的列页数和视图数为20而不是10

[已编辑]

使用:include重写的查询

c.pages.sum(:views, :conditions => ["id in (select distinct tags.page_id from tags where tags.id in (?))", tag_ids]

你试过加入而不是包含吗?你试过加入而不是包含吗?这就解释了,非常感谢。你知道我怎样才能避免它吗?我尝试使用:joins,但计算起来需要很长时间,而且我还需要选择按标记筛选。如果每个页面有大约4个标记,那么您将得到48448个标记,并且每页有4个标记似乎是合理的。@MarceloJ尝试将包含“标记”的条件重写到子查询中。。。我需要更多关于“条件”的详细信息来提供更具体的帮助在这种情况下,q in:conditions可以有以下内容:“tags.id in(:t_id)”,其中:t_id是标记id的列表。非常感谢Adrian,你是救世主。这就解释了,非常感谢。你知道我怎样才能避免它吗?我尝试使用:joins,但计算起来需要很长时间,而且我还需要选择按标记筛选。如果每个页面有大约4个标记,那么您将得到48448个标记,并且每页有4个标记似乎是合理的。@MarceloJ尝试将包含“标记”的条件重写到子查询中。。。我需要更多关于“条件”的详细信息来提供更具体的帮助在这种情况下,q in:conditions可以有这样的内容:“tags.id in(:t_id)”,其中:t_id是标记id的列表。非常感谢Adrian,你是救世主。