如何在Mongoid哈希字段查询中传入动态日期变量?
解决Mongoid动态哈希字段查询的问题
嘿,这个需求其实很好实现,核心就是动态构建查询的键名,而且完全能保留Mongoid::Criteria的链式查询能力,下面给你两种实用的写法:
方法一:直接用字符串插值生成查询键
Ruby的字符串插值可以帮你把变量day直接嵌入到查询的键路径里,写法非常直观:
# 假设day是动态传入的变量(比如从请求参数或业务逻辑获取) day = "monday" # 动态构建查询条件 Business.where(:"hours.#{day}.close_hour".lt => 23)
当day是tuesday时,这条代码会自动转换成:"hours.tuesday.close_hour".lt => 23,和你原来的固定写法效果完全一致,而且返回的是标准的Mongoid::Criteria对象,完全可以接着链式调用其他查询方法,比如:
Business.where(:"hours.#{day}.close_hour".lt => 23) .where(rating: { "$gte" => 4.5 }) .order(updated_at: :desc) .limit(10)
方法二:先构建键再生成查询(更清晰的拆分写法)
如果你觉得直接插值有点乱,也可以先把查询键单独生成,再传入where方法:
day = "wednesday" # 先拼接出完整的键路径并转成符号 query_key = "hours.#{day}.close_hour".to_sym # 执行查询 Business.where(query_key.lt => 23)
这种写法和第一种本质上是一样的,只是把键的生成和查询逻辑分开了,可读性可能更好一点。
额外建议:校验变量合法性
为了避免传入无效的星期几字符串(比如"holiday")导致查询出错,建议加个简单的校验:
valid_days = %w[monday tuesday wednesday thursday friday saturday sunday] day = params[:day] # 假设从请求参数获取 if valid_days.include?(day.downcase) # 合法的情况下执行查询 Business.where(:"hours.#{day.downcase}.close_hour".lt => 23) else # 非法值返回空的查询结果,或者根据业务需求处理 Business.none end
这样能保证你的查询始终是有效的,不会因为变量问题抛出异常。
内容的提问来源于stack exchange,提问作者Josh Kestenberg
相关产品推荐
相关产品推荐

