6

Mongoid で、同じドキュメント内の 2 つの Time フィールドを比較する名前付きスコープを作成する必要があります。そのような

scope :foo, :where => {:updated_at.gt => :checked_at}

:checked_atこれは、実際のフィールドではなくシンボルとして扱われるため、明らかに機能しません。これを行う方法について何か提案はありますか?

更新 1

これは、このスコープを宣言し、多くの余分なコードを取り除いた私のモデルです。

class User
  include Mongoid::Document
  include Mongoid::Paranoia
  include Mongoid::Timestamps

  field :checked_at, :type => Time

  scope :unresolved, :where => { :updated_at.gt => self.checked_at }
end

これにより、次のエラーが表示されます。

'<class:User>': undefined method 'checked_at' for User:Class (NoMethodError)

4

3 に答える 3

8

私の知る限り、mongodb は動的な値に対するクエリをサポートしていません。ただし、JavaScript 関数を使用できます。

scope :unresolved, :where => 'this.updated_at >= this.checked_at'

これを高速化するには、「is_unresolved」のような属性を追加できます。これは、この条件が一致したときに更新時に true に設定されます (およびそのインデックスを作成します)。

于 2010-10-13T19:56:30.870 に答える
3
scope :foo, :where => {:updated_at.gt => self.checked_at}

たとえば、これは機能します:

scope :foo, where(:start_date.lte=>Date.today.midnight)
于 2010-09-25T20:52:27.680 に答える
1

この方法が気に入るかどうかはわかりませんが、最善ではありませんが、うまくいくはずです。

class User
  include Mongoid::Document
  include Mongoid::Paranoia
  include Mongoid::Timestamps

  field :checked_at, :type => Time

  scope :unresolved, lambda{ |user| where(:updated_at.gt => user.checked_at) }
end

User.unresolved(my_user_object) で呼び出します。投稿を読み直した後、これはおそらくあなたが望むことをしないようです。これが当てはまる場合は、おそらく MapReduce または Baju の方法を使用する必要があります (まだテストしていません)。

于 2010-10-14T07:43:59.753 に答える