ruby-on-rails-3 – 多个日期范围内的Rails 3查询
发布时间:2020-12-17 02:35:45 所属栏目:百科 来源:网络整理
导读:假设我们有一些日期范围,例如: ranges = [ [(12.months.ago)..(8.months.ago)],[(7.months.ago)..(6.months.ago)],[(5.months.ago)..(4.months.ago)],[(3.months.ago)..(2.months.ago)],[(1.month.ago)..(15.days.ago)] ] 和一个Post模型:created_at属性.
假设我们有一些日期范围,例如:
ranges = [ [(12.months.ago)..(8.months.ago)],[(7.months.ago)..(6.months.ago)],[(5.months.ago)..(4.months.ago)],[(3.months.ago)..(2.months.ago)],[(1.month.ago)..(15.days.ago)] ] 和一个Post模型:created_at属性. 我想查找created_at值在此范围内的帖子,因此我们的目标是创建一个类似的查询: SELECT * FROM posts WHERE created_at BETWEEN '2011-04-06' AND '2011-08-06' OR BETWEEN '2011-09-06' AND '2011-10-06' OR BETWEEN '2011-11-06' AND '2011-12-06' OR BETWEEN '2012-01-06' AND '2012-02-06' OR BETWEEN '2012-02-06' AND '2012-03-23'; 如果您只有一个这样的范围: range = (12.months.ago)..(8.months.ago) 我们可以做这个查询: Post.where(:created_at => range) 和查询应该是: SELECT * FROM posts WHERE created_at BETWEEN '2011-04-06' AND '2011-08-06'; 有没有办法使用像这个Post.where(:created_at =>范围)这样的符号来进行此查询? 构建此查询的正确方法是什么? 谢谢 解决方法
对于帕伦来说,它有点激进,但准备潜入这个兔子洞
ranges = [ ((12.months.ago)..(8.months.ago)),((7.months.ago)..(6.months.ago)),((5.months.ago)..(4.months.ago)),((3.months.ago)..(2.months.ago)),((1.month.ago)..(15.days.ago)) ] table = Post.arel_table query = ranges.inject(table) do |sum,range| condition = table[:created_at].in(range) sum.class == Arel::Table ? condition : sum.or(condition) end 然后,query.to_sql应该相等 (((("sessions"."created_at" BETWEEN '2011-06-05 12:23:32.442238' AND '2011-10-05 12:23:32.442575' OR "sessions"."created_at" BETWEEN '2011-11-05 12:23:32.442772' AND '2011-12-05 12:23:32.442926') OR "sessions"."created_at" BETWEEN '2012-01-05 12:23:32.443112' AND '2012-02-05 12:23:32.443266') OR "sessions"."created_at" BETWEEN '2012-03-05 12:23:32.443449' AND '2012-04-05 12:23:32.443598') OR "sessions"."created_at" BETWEEN '2012-05-05 12:23:32.443783' AND '2012-05-21 12:23:32.443938') 你应该能够做Post.where(查询) 编辑 你也可以这样做: range_conditions = ranges.map{|r| table[:created_at].in(r)} query = range_conditions.inject(range_conditions.shift,&:or) 保持一点简洁 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |