2

したがって、この質問は 2 年前のものです。

Mongoid/Rails 3 の埋め込みオブジェクトのクエリ ("Lower than"、Min 演算子、および並べ替え)

ネストされたオブジェクトに対して、より小さいまたはより大きいクエリを実行することを推奨する方法は次のとおりです。

current_user.trips.where('start.time' => {'$gte' => Time.now}).count

単純に機能しません。このような多数のクエリに対して 0 を返しますが、これは間違っています。私も試してみました

current_user.trips.where(:'start.time'.gte => Time.now}).count

これも 0 です。実際にエラーをスローするものはありません。

現在、ネストされた要素を照会するための正しい構文は何ですか? これについてはかなりの混乱があるようです。

4

1 に答える 1

2

私の環境では期待通りに動作します。(モンゴイド 3.1.3)

class User
  include Mongoid::Document
  embeds_many :trips
end

class Trip
  include Mongoid::Document
  embeds_one :start
  embedded_in :user
end

class Start
  include Mongoid::Document
  field :time, type: DateTime
  embedded_in :trip
end

User.create({ trips: [
  Trip.new({ start: Start.new({ time: 5.days.ago }) }),
  Trip.new({ start: Start.new({ time: 2.days.from_now }) })
] })

current_user = User.where({}).first

p current_user.trips.where('start.time' => {'$gte' => Time.now}).count
p current_user.trips.where(:'start.time'.gte => Time.now).count

上記のコードは以下を出力します。

1
1

本当に$gte正しいですか?日付を比較するときに反対の符号を使用するのはよくある間違いです。

または、古いバージョンの Mongoid を使用している可能性があります。

アップデート:

次のコードを使用して、Mongoid が生成するクエリを確認できます。

Mongoid.logger.level = Logger::DEBUG
Moped.logger.level = Logger::DEBUG
Mongoid.logger = Logger.new($stdout)
Moped.logger = Logger.new($stdout)

これはデバッグに役立ちます。

于 2013-05-13T03:00:05.720 に答える