使用rails查询即将到来的生日?

时间:2014-02-28 13:07:06

标签: ruby-on-rails ruby-on-rails-3 mongodb ruby-on-rails-4

我正在使用Rails v4和MongoDB。我有一个列'dob日期类型,我想找到即将到来的生日?请帮忙。

我尝试过如下但没有用:

scope :upcoming_birthdays, -> 
      { 
         where({"dob.strftime('%m').lte" => 
              (Date.today+3.days).month, 
              "dob.strftime('%d').lte" =>(Date.today+3.days).day}) 
      }

2 个答案:

答案 0 :(得分:0)

在mongo中,您可以使用聚合框架

db.collection.aggregate([
  {$project: {_id: 1, month: {$month: '$dob'}, day: {$dayOfMonth: '$dob'}}},
  {$match: {month: 9, day: 14}} ])

使用您想要的实际$match条件。

所以你应该抽出你的范围来实现它,或者实现类方法而不是范围。

答案 1 :(得分:0)

最后我得到了解决方案,但它必须重新考虑。在这里,我今天和接下来的两天生日用户详细信息。

pro = {:day => {:$dayOfMonth => '$dob'}, :month => {:$month => '$dob'}, :year => {:$year => '$dob'} } 
today = Date.today
birth_dates = [today.day, (today+1.day).day, (today+2.days).day ]
birth_months = [today.month, (today+1.day).month, (today+2.days).month ].uniq
mat = {day: { '$in' => birth_dates } , month: { '$in' => birth_months } }
uids = User.collection.aggregate([{:$project => pro }, {:$match =>  mat  }]).map{ |h| h["_id"] }
birth_users = User.find(uids, :order => :dob)

但问题是,这里的dob字段是可选的,因此导致以下错误

失败,错误16006:异常:无法从BSON类型EOO转换为日期

任何人都建议。

谢谢, 普拉萨德