世界上最伟大的投资就是投资自己的教育
gem 介绍之 by_star 使用 (三)
随风发布于3368 次阅读
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 条回复
暂无回复~~
© 汕尾市求知科技有限公司 | Rails365 Gitlab | 知乎 | b 站 | csdn
粤公网安备 44152102000088号 | 粤ICP备19038915号
Top