Gem GEM by_star 简易教程 + 实例

jesktop · 2012年03月27日 · 最后由 JeskTop 回复于 2012年03月31日 · 5633 次阅读

by_star 是一个辅助 ActiveRecord 的组件,让你可以简单的实现按某年,某月,某日,或者星期几,来查询数据,用起来非常简单,省下麻烦的条件组合,此外,它还可以查询上一篇,下一篇类似的功能。 下面我结合它所生成的 SQL 语句,来简单介绍一下这个 GEM 的大部分方法的用法。

注:目前我电脑上时间为 2012 年 3 月 26 日,16:21,系统为 ubuntu11.10 1.Book.by_year(2012) 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-01-01 00:00:00.000000' AND books.created_at <= '2012-12-31 23:59:59.999999')


顾名思义,就是根据年份进行搜索范围

2.@books.count_by_year('name') 注:@books = Book.all 既 books 表中的 name 列 生成 SQL 语句

SELECT COUNT("books"."name") FROM "books" WHERE (books.created_at >= '2012-01-01 00:00:00.000000' AND books.created_at <= '2012-12-31 23:59:59.999999') 


对该数据标中的 name 一列的行数是多少,并可以设置年份或者月份范围,详情见最后的参考文献

3.@books.sum_by_year('name') 生成 SQL 语句

SELECT SUM("books"."name") AS sum_id FROM "books" WHERE (books.created_at >= '2012-01-01 00:00:00.000000' AND books.created_at <= '2012-12-31 23:59:59.999999') 


对该数据标中的 name 一列,里面数据的总和,并可以设置年份或者月份范围,详情见最后的参考文献

4.Book.by_month(3) 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-01 00:00:00.000000' AND books.created_at <= '2012-03-31 23:59:59.999999')


顾名思义,就是根据月份进行搜索范围

5.Book.by_fortnight 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-26 00:00:00.000000' AND books.created_at <= '2012-04-09 00:00:00.000000')


搜索从今天起,往后的 2 个星期内的数据

6.Book.by_week 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-04-01 00:00:00.000000' AND books.created_at <= '2012-04-08 00:00:00.000000') 


下一周的数据

7.Book.by_weekend(Time.now) 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-30 07:00:00.000000' AND books.created_at <= '2012-03-31 15:59:59.999999')


即将到来的周末时间

8.Book.today 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-26 00:00:00.000000' AND books.created_at <= '2012-03-26 23:59:59.999999')


当天时间,也就算 today

9.Book.by_current_weekend 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-30 15:00:00.000000' AND books.created_at <= '2012-04-02 03:00:00.000000')


如果你在工作日的时候范围将是(3pm 星期 5 之间 3am 星期 1) 如果你在周末的时候,范围将是(3am 星期 1 之间 3pm 星期 5)

10.Book.by_current_work_week 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-26 03:00:00.000000' AND books.created_at <= '2012-03-30 15:00:00.000000') 


工作日的范围,与 by_current_weekend 相反

11.Book.tomorrow(Date.today + 2) 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-29 00:00:00.000000' AND books.created_at <= '2012-03-29 23:59:59.999999')


在没有参数的情况下为第二天,因为在参数使用了 Date.today + 2,所以范围变成了 27+2

12.Book.yesterday(Time.now + 5.days) 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-29 16:00:00.000000' AND books.created_at <= '2012-03-30 15:59:59.999999')


昨天所生成的数据,在这里参数设置为 Time.now + 5.days,所以范围在 29-30 号,Time.now 包含了当前的时刻

13.Book.past 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at < '2012-03-26 08:35:58.965390')


此时此刻之前的时间段

14.Book.future 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at > '2012-03-26 08:37:08.885779')


此时此刻之后的时间段

15.Book.between("last tuesday", Date.today) 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-20 04:00:00.000000' AND books.created_at <= '2012-03-26 00:00:00.000000')


自己定义时间范围段,本例子的时间段为上个星期 2 到今天

16.Book.as_of_2_weeks_ago 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-12 08:41:13.847107' AND books.created_at <= '2012-03-26 08:41:13.879807')


as_of_是意思从某个时间段至今,本例子是设置了 2 个星期之前到今天

17.Book.up_to_6_weeks_from_now 生成 SQL 语句

SELECT "books".* FROM "books" WHERE (books.created_at >= '2012-03-26 08:42:05.754650' AND books.created_at <= '2012-05-07 08:42:05.751732')


up_to_和 as_of_相反,就是至从今天一直到将来某个时候

这里除了 Previous (previous) 和 Next (next) 外,对时间范围设置的已经基本介绍清楚,基本每个方法可以设置参数的,但是由于这样会相当庞大,太多东西需要描述了,所以这里就不多做解释啦。详细的,在 by_star 中 README 有很详细的介绍,网址如下: http://rubydoc.info/gems/by_star/1.0.1/frames

------------------------------------------------------------------------------------------------------------------------ 下面,我这里大概的介绍一下我写的一个使用 by_star 的简单例子: CRUD 通过 Scaffold 生成之后,对生成的本分,进行简单的编辑。 我的思路是,我建立一个搜索框,输入月份,然后进行搜索,根据表中的销售时间(sale)进行塞选范围,在 index.html.erb 中增加一个搜索框,HTML 代码如下:

<%= form_tag('index', :method =>'get') do %>
  <%= label_tag :month, "按月份查询:" %>
  <%= text_field_tag :month %>
  <%= submit_tag "Search" %>
<% end %>


搜索结果将会也在 index.html.erb 中显示,代码直接通过脚手架生成,没有做更改,如下:

<% @books.each do |book| %>
  <tr>
    <td><%= book.name %></td>
    <td><%= book.sale %></td>
    <td><%= link_to 'Show', book %></td>
    <td><%= link_to 'Edit', edit_book_path(book) %></td>
    <td><%= link_to 'Destroy', book, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>


好了,现在我们看看 controller 增加了些什么。 只是对 books 中的 index 方法稍作了修改,整个 index 的代码如下:

def index

  if params[:month]   #判断是直接打开首页,还是进行了搜索
    @books = Book.by_month(params[:month].to_i, :field => 'sale') 
    # 根据月份进行范围筛选,作用域在‘sale’上,如果:field不设置的话,默认是创建时间
  else
    @books = Book.as_of_2_weeks_ago
    # 如果没有搜索的情况下,将默认显示2个星期前的数据信息
  end

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @books }
  end
end


还有 routes.rb 中的代码

root :to => 'books#index'
resources :books
get "index" => "books#index", :as => "index"  #因为我搜索条到index


这是这 2 天里,学习 by_star 的小小心得,希望可以方便别人学习,因为我是 Rails 的初学者,英语不太好,所以一开始看这个 gem 的文档觉得很吃力,因为没有学习的例子参考,所以为了大家提高学习效率,所以我在这里写下了学习的心得,希望新手们可以更加高效。 不过不知道例子写的好不好,希望有大牛可以指点一下。

以后大牛教大家牛的知识,我就写写心得,写写很简单的教程,让新手学习不走弯路,可以更有信心。

3Q~

参考: http://rubygems.org/gems/by_star http://rubydoc.info/gems/by_star/1.0.1/frames

mark 一下,我过会要用,这个很有用了,怎么没有人喜欢?

#1 楼 @azhao 谢谢支持。 如果 Previous (previous) 和 Next (next) 的实例,欢迎贴出来哦~

这个有 mogoid 滴么?

#3 楼 @huobazi 不好意思啊。我不懂 NOSQL,所以就只用了 SQL 的拉。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号