Module: TimeScopes

Defined in:
lib/time_scopes.rb,
lib/time_scopes/version.rb

Constant Summary collapse

VERSION =
"0.1.1"

Class Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/time_scopes.rb', line 2

def self.included(klass)

  klass.class_eval do
    return unless klass.table_exists?

    connection = ActiveRecord::Base.connection
    adapter    = connection.adapter_name

    table_name = klass.table_name
    quoted_table_name = klass.quoted_table_name

    klass.columns.each do |column|
      column_name = column.name

      quoted_column_name = [quoted_table_name, connection.quote_column_name(column_name)].join(".")

      if [:date, :datetime].include?(column.type)
        if column_name.last(3) == "_at"
          aliased = column_name.chomp("_at")

          scope "#{aliased}_today",       lambda { where("#{quoted_column_name} > ?", Time.zone.now.beginning_of_day) }
          scope "#{aliased}_yesterday",   lambda { where("#{quoted_column_name} BETWEEN ? AND ?", Time.zone.now.yesterday.beginning_of_day, Time.zone.now.yesterday.end_of_day) }
          scope "#{aliased}_between",     lambda { |from, to| where("#{quoted_column_name} BETWEEN ? AND ?", from, to) }
          scope "not_#{aliased}_between",   lambda { |from, to| where("#{quoted_column_name} NOT BETWEEN ? AND ?", from, to) }
          scope "#{aliased}_before",        lambda { |datetime| where("#{quoted_column_name} < ?", datetime) }
          scope "#{aliased}_after",         lambda { |datetime| where("#{quoted_column_name} > ?", datetime) }

          scope "#{aliased}_in_last_week",  lambda { where("#{quoted_column_name} > ?", 1.week.ago) }
          scope "#{aliased}_in_last_month", lambda { where("#{quoted_column_name} > ?", 1.month.ago) }
          scope "#{aliased}_in_last_year",  lambda { where("#{quoted_column_name} > ?", 1.year.ago) }
          scope "#{aliased}_in_month",      lambda { |datetime| where("#{quoted_column_name} BETWEEN ? AND ?", datetime.beginning_of_month, datetime.end_of_month) }
          scope "#{aliased}_in_day",        lambda { |datetime| where("#{quoted_column_name} BETWEEN ? AND ?", datetime.beginning_of_day, datetime.end_of_day) }
          scope "#{aliased}_ago",           lambda { |period_count, period_type| where("#{quoted_column_name} > ?", period_count.send(period_type).ago) }
        end
      end
    end
  end
end