【问题标题】:rails mongoid query multiple fields with same valuerails mongoid 查询具有相同值的多个字段
【发布时间】:2015-05-31 06:36:51
【问题描述】:

我有 3 个带有 type: Time 的字段。

field :last_updated, type: Time
field :last_event, type: Time
field :last_status, type: Time

我怎样才能进行查询 - 它将提供所有这些字段都在 30 分钟之前的所有记录?

我不想写下面的查询-

Model.where(:last_status.lt => 30.minutes.ago,:last_event.lt => 30.minutes.ago,:last_updated.lt => 30.minutes.ago).all

我想做这样的事情:

def updated_date
  timestamps = [self.last_status,self.last_event,self.last_updated]
  timestamps.reject(&:nil?).max
end
Model.where(updated_date.lt => 30.minutes.ago).all

但它不起作用......

我不想维护更多的字段,每次更新这些字段之一时,这些字段都会更新为最新的字段...

有什么想法吗?

【问题讨论】:

  • updated_date.. 方法有什么问题。它不起作用?

标签: ruby-on-rails datetime mongoid


【解决方案1】:

好吧,这里是工作代码:

def updated_date
  timestamps = [ :last_status, :last_event, :last_updated ]
  timestamps.reject { |sym| self.public_send(sym).nil? }
            .max { |sym| self.public_send(sym) }
end

Model.where(:updated_date.lt => 30.minutes.ago).all

另一种编写updated_date 方法的方法,这将节省两次方法调用

def updated_date
  timestamps = { 
                 last_status: self.last_status,
                 last_event: self.last_event,
                 last_updated: self.last_updated
               }
  timestamps.reject { |_, v| v.nil? }.max_by(&:last).first
end
Model.where(:updated_date.lt => 30.minutes.ago).all

【讨论】:

  • 你能解释一下吗?什么是 public_send?
  • 谢谢,我稍后再查。
  • 我收到undefined local variable or method updated_date for main:Object
  • B.T.W - 你知道为什么在第一个选项中 Model.first.updated_date 不起作用,而在第二个选项中它起作用了吗?
  • 我当然会接受。但请离开他们两个。第二个代码效果更好。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2021-08-14
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多