Model.sum возвращает неточную сумму при использовании: include (рельсы 2.3.8) - PullRequest
0 голосов
/ 07 ноября 2011

У меня была эта проблема, которую я просто не могу решить. Мне нужно получить сумму атрибута "views" в моем объекте, однако при использовании: 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

: теги и: author не имеют атрибута: views или даже чего-либо удаленно схожего, и даже указание атрибута в pages.views дает тот же результат.

К сожалению, мне нужно получить это значение через базу данных, чтобы быстро сгенерировать график для представлений. Переменная q, используемая в условиях, является фильтром, и причина: include необходима. Я не понимаю, что может быть причиной того или иного значения 48448;

Буду признателен за любую помощь в этом, и заранее спасибо.

1 Ответ

3 голосов
/ 07 ноября 2011

Предположим ситуацию

pages
id|name    |views
1 |my_page |10

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

с использованием

:include => [:tags]

Вы дублируете страницу с 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

Сумма на столбце pages.viewsдля этого результирующего набора 20, а не 10.

[Отредактировано]

Переписать запрос без использования: include

c.pages.sum(:views, :conditions => ["id in (select distinct tags.page_id from tags where tags.id in (?))", tag_ids]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...