Область действия с именем Mongoid, сравнивающая два временных поля в одном документе - PullRequest
5 голосов
/ 25 сентября 2010

Мне нужно создать именованную область в Mongoid, которая сравнивает два поля времени в одном документе. Такие как

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)

Ответы [ 3 ]

7 голосов
/ 13 октября 2010

Насколько я знаю, mongodb не поддерживает запросы к динамическим значениям. Но вы можете использовать функцию JavaScript:

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

Чтобы ускорить это, вы можете добавить атрибут, такой как "is_unresolved", который будет установлен в true при обновлении, когда это условие соответствует (и индексирует это).

3 голосов
/ 26 сентября 2010
scope :foo, :where => {:updated_at.gt => self.checked_at}

Например, это будет работать:

scope :foo, where(:start_date.lte=>Date.today.midnight)
1 голос
/ 14 октября 2010

Не уверен, что вам понравится этот метод, он не самый лучший, но он должен работать.

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 или, возможно, метод Баджу (не проверял его)

...