世界上最伟大的投资就是投资自己的教育

全场限时 5 折

首页Ruby
随风 · 练气

gem 介绍之 by_star 使用 (三)

随风发布于2953 次阅读

1. 介绍

废话不多说,直接看下面的例子:

在电子商务系统中,这样的需求是很常见的,就是据据时间来筛选特定的订单。

要实现这样的功能很简单,前端部分就不多说了,在后端的部分不过就是一条 where 的查询语句。例如:

SELECT COUNT(*) FROM `abroad_orders` WHERE (`abroad_orders`.`status` != 'declined') AND (abroad_orders.created_at BETWEEN '2016-01-05 16:00:00.000000' AND '2016-01-06 15:59:59.999999')

相关的 ruby 代码类似下面:

module Filterable

  DATETIMERANGE = {date: "日期", between: "日期范围...", today: "今天", yesterday: "昨天", this_week: "本周", last_week: "上周"}

  extend ActiveSupport::Concern

  module ClassMethods

    mattr_accessor :date_column

    def filter_date(filtering_params)

      self.date_column = filtering_params["date_column"]
      date             = filtering_params["#{self.date_column}_date"]
      from             = filtering_params["#{self.date_column}_from"]
      to               = filtering_params["#{self.date_column}_to"]

      case filtering_params["#{self.date_column}"]
        when 'date'      then date(date)
        when 'between'   then between(from, to)
        when 'today'     then today
        when 'yesterday' then yesterday
        when 'this_week' then this_week
        when 'last_week' then last_week
        else default
      end

    end

    private

    def between(from, to)
      if from.present? && to.present?
        base(from.to_date.beginning_of_day, to.to_date.end_of_day)
      else
        default
      end
    end

    def date(date)
      if date.present?
        base(date.to_date.beginning_of_day, date.to_date.end_of_day)
      else
        default
      end
    end

    def today
      base(Time.now.beginning_of_day, Time.now.end_of_day)
    end

    def yesterday
      base(Time.now.yesterday.beginning_of_day, Time.now.yesterday.end_of_day)
    end

    def this_week
      base(Time.now.beginning_of_week, Time.now.end_of_week)
    end

    def last_week
      base(Time.now.last_week.beginning_of_week, Time.now.last_week.end_of_week)
    end

    def default
      self.where(nil)
    end

    def base(from, to)
      self.where("#{self.table_name}.#{self.date_column} BETWEEN ? AND ?", from, to)
    end
  end
end

这样是能实现的,且没有问题。

但是这篇文章要介绍的是by_star,它不仅实现了上面的功能,还包含了其他更多的功能。

2. 安装与使用

在 Gemfile 中添加下面这行:

gem 'by_star', :git => "git://github.com/radar/by_star"

找到需要查询的 model,类似下面这样:

class Article < ActiveRecord::Base
  by_star_field :created_at
end

开启rails console,我们来查询昨天的所有文章。

> Article.yesterday
  Article Load (13.9ms)  SELECT "articles".* FROM "articles" WHERE (created_at >= '2016-01-20 16:00:00.000000' AND created_at <= '2016-01-21 15:59:59.999999')

可见,生成了正确的 sql 查询语句。

其他的功能还有 by_month,by_week 等,都可以和上面的需求相对应,至于更多,更具体的功能,可以查看官方的 readme 文档。

完结。

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
喜欢
统计信息
    学员: 29064
    视频数量: 1973
    文章数量: 489

© 汕尾市求知科技有限公司 | Rails365 Gitlab | Qiuzhi99 Gitlab | 知乎 | b 站 | 搜索

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top