2011-11-22 13 views
8

:複数の証拠を持っているだけで数週間を見つけるにはレールとモンゴイドを使った関連付けの「カウント」でレコードを検索するにはどうすればよいですか?これらのモデルでは

Week.where(:proof.count.gt => 0) 

class Week 
    has_many :proofs 
end 
class Proof 
    belongs_to :week 
end 

は、私のような何かをしたいです。

これに対処するためと思われる1つの答えがあります:

Can rails scopes filter on the number of associated classes for a given field

は、しかし、IDが証明して保存されているので、この例では、週にproof_idsというような属性がありません。これは動作しません:

Week.where(:proof_ids.gt => 0) 

どのようにこのクエリは可能ですか?概念的には単純ですが、私はmongoやmongoidでこれを行う方法を理解できません。

同様に、私は次のように例えば証拠の数だけ注文したいと思います:

Week.desc(:proofs.size) 

しかし、これはまた、動作しません。

カウンタキャッシュは両方の特定の質問のオプションであることを認識していますが、クエリを実行することもできます。

ご協力いただきありがとうございます。

答えて

5

class Week < ActiveRecord::Base 
    has_many :proofs 

    def self.by_proofs_size 
    sort_by { |week| week.proofs.size } 
    end 

    def self.with_at_least_n_proofs(n = 1) 
    select { |week| week.proofs.size >= n } 
    end 
end 

これらの操作のそれぞれが2クエリを生成していますが、これは理想からかけ離れています。

クエリのペアがスコープで(各操作のために=> 4つのクエリ)繰り返される(バグ?):

​​

理想的にはcounter_cache

scope :with_at_least_n_proofs, -> (n = 1) { where('proofs_count >= ?', n) } 
scope :by_proofs_size, -> { order(proofs_count: :desc) } 
+0

includes(:proofs)を削除して、パフォーマンスを1トン増やすことができます。現在のところ、すべてのデータをロードしています:プルーフ、本当に必要なのはクイックカウントクエリです。やってみて。 –

+0

@RobVolkこれは古いコードでした!ヘッドアップをありがとう! – Damien

+0

データベースからアプリケーションのメモリまでのすべての証明をすべての週に受け取るので、アプリケーションを終了させます – antiqe

0

もし私がオフになったら私を許してください。しかし、あなたは週のテーブルで簡単なcounter_cacheを使うことができますか?それからweek.proofs_countのようなことをすることができます。 、あなたができるレール(およびcounter_cacheなし)で

+0

ええ、私の質問で言ったように、私はcounter_cacheがオプションであることを知っていますが、この場合は可能ならクエリを実行したいと思います。それがうまくいかない場合、私は間違いなくカウンタキャッシュを実行します。 – eagspoo

4

を使用することがおそらく私が「ドンこれが最良の解決策であるかどうかを知っていますが、それは配列を介してマップされますが、これは仕事をします:

関連する問題