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
|