2

Mongoidを使用した次のモデルがあります。

class Album
  have_many :images
end

class Image
  belongs_to :album
end

画像のあるアルバムのみを取得したい:

Album.all.select{ |a| a.images.count > 0 }

しかし、それは配列を返し、Mongoid::Criteriaが必要です。私は次のようなものを使ってみました:

Album.where( "this.images.count > 0" )

そしてそれは常に0要素を返します。¿どうすればできますか?

4

1 に答える 1

1

実際には配列ではなく、プロキシです。ログを確認すると、モペットがすべてのアルバム (私の場合は 2) に対して .count 関数を呼び出していることがわかります。

1.9.3-p194 :043 > Album.each { |a| a.images.count }
  MOPED: 127.0.0.1:27017 QUERY        database=mongo_benchmark collection=albums selector={} flags=[] limit=0 skip=0 fields=nil (0.7441ms)
  MOPED: 127.0.0.1:27017 COMMAND      database=mongo_benchmark command={:count=>"images", :query=>{"album_id"=>"50e36dd17c71c110ff000001"}} (0.5209ms)
  MOPED: 127.0.0.1:27017 COMMAND      database=mongo_benchmark command={:count=>"images", :query=>{"album_id"=>"50e36f8f7c71c110ff000004"}} (0.3800ms)

また、Criteriaオブジェクトを取得したい場合は、次のことができますalbum.images.scoped

アルバムがたくさんある場合は、1 枚ごとにコール カウントが行われますが、これは良くありません。このような状況では、カウンター キャッシュを使用することをお勧めします。Mongoid https://github.com/arthurnn/mongoid/tree/2215-counter_cacheへのカウンターキャッシュを含むブランチを使用できます

于 2013-01-01T23:24:29.040 に答える