2011-11-07 5 views
0

私はこの問題を抱えています。私はオブジェクトの属性 "views"を集計する必要がありますが、includeを使用すると非常に甘い金額になります。Model.sum使用時に無精量を返す:include(rails 2.3.8)

>> 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 

:タグと:著者が持っていない:ビューは、属性またはリモートで似た、とさえpages.viewsと属性を指定しても何も同じ結果が得られます。

残念ながら、ビューのグラフをすばやく生成するには、データベースからその値を取得する必要があります。条件で使用されるq変数はフィルタであり、理由は:includeが必要です。私はこれを引き起こす可能性があるか、その48448の値がどこから来ているのか理解していません。

私はこれに助けていただきありがとうございます。

+0

が含まれますが参加の代わりに含めるを試してみたのですか? – tokland

答えて

3

状況あなたは、ID = 1で2回ページを複製している

:include => [:tags] 

を使用して

pages 
id|name |views 
1 |my_page |10 

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

と想定します。この結果セットの列pages.viewsに

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 not 10。

使用witout [編集]

書き換えられたクエリ:

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

それについて説明します、ありがとうございます。私はそれを避ける方法を知っていますか?私はジョインを使ってみましたが、計算に時間がかかり、タグでフィルタリングするオプションも必要です。 – MarceloJ

+0

そして、各ページに約4つのタグがある場合は、ページあたり48448と4つのタグが得られます。 –

+0

@MarceloJ「タグ」を含む条件をサブクエリに書き直してみてください...より具体的なヘルプを提供するための「条件」の詳細が必要です –

関連する問題