pacecar 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +6 -2
- data/lib/pacecar/associations.rb +3 -3
- data/lib/pacecar/boolean.rb +2 -2
- data/lib/pacecar/datetime.rb +9 -9
- data/lib/pacecar/duration.rb +3 -3
- data/lib/pacecar/limit.rb +1 -1
- data/lib/pacecar/order.rb +1 -1
- data/lib/pacecar/polymorph.rb +1 -1
- data/lib/pacecar/presence.rb +2 -2
- data/lib/pacecar/ranking.rb +1 -1
- data/lib/pacecar/search.rb +5 -5
- data/lib/pacecar/state.rb +4 -4
- metadata +18 -6
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
== Pacecar
|
2
2
|
|
3
|
-
Pacecar adds
|
3
|
+
Pacecar adds scope methods and other common functionality to ActiveRecord classes via database column introspection.
|
4
4
|
|
5
5
|
Pacecar automatically includes the Pacecar::Helpers module into all ActiveRecord::Base classes.
|
6
6
|
|
@@ -96,6 +96,10 @@ Records where an attribute starts or ends with a search term...
|
|
96
96
|
User.first_name_starts_with('A')
|
97
97
|
User.first_name_ends_with('a')
|
98
98
|
|
99
|
+
Records where an attribute matches exactly a term...
|
100
|
+
|
101
|
+
User.first_name_equals('John')
|
102
|
+
|
99
103
|
Records where any non-state text or string column matches term...
|
100
104
|
|
101
105
|
User.search_for('test')
|
@@ -187,7 +191,7 @@ First x records...
|
|
187
191
|
|
188
192
|
= Named scopes
|
189
193
|
|
190
|
-
Because these are all
|
194
|
+
Because these are all scope, you can combine them.
|
191
195
|
|
192
196
|
To get all users that have a first_name set, who are admins and approved more than 2 weeks ago, ordered by their first name...
|
193
197
|
|
data/lib/pacecar/associations.rb
CHANGED
@@ -8,19 +8,19 @@ module Pacecar
|
|
8
8
|
|
9
9
|
def has_recent_records(*names)
|
10
10
|
names.each do |name|
|
11
|
-
|
11
|
+
scope "recent_#{name}_since".to_sym, lambda { |since|
|
12
12
|
{
|
13
13
|
:conditions => [conditions_for_name(name), { :since_time => since }]
|
14
14
|
}
|
15
15
|
}
|
16
16
|
end
|
17
17
|
unless names.first == names.last
|
18
|
-
|
18
|
+
scope "recent_#{names.join('_or_')}_since".to_sym, lambda { |since|
|
19
19
|
{
|
20
20
|
:conditions => [names.collect { |name| conditions_for_name(name) }.join(' or '), { :since_time => since }]
|
21
21
|
}
|
22
22
|
}
|
23
|
-
|
23
|
+
scope "recent_#{names.join('_and_')}_since".to_sym, lambda { |since|
|
24
24
|
{
|
25
25
|
:conditions => [names.collect { |name| conditions_for_name(name) }.join(' and '), { :since_time => since }]
|
26
26
|
}
|
data/lib/pacecar/boolean.rb
CHANGED
@@ -14,8 +14,8 @@ module Pacecar
|
|
14
14
|
|
15
15
|
def define_boolean_scopes
|
16
16
|
boolean_column_names.each do |name|
|
17
|
-
|
18
|
-
|
17
|
+
scope name.to_sym, :conditions => ["#{quoted_table_name}.#{name} = ?", true]
|
18
|
+
scope "not_#{name}".to_sym, :conditions => ["#{quoted_table_name}.#{name} = ?", false]
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
data/lib/pacecar/datetime.rb
CHANGED
@@ -21,40 +21,40 @@ module Pacecar
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def define_before_after_scopes(name)
|
24
|
-
|
24
|
+
scope "#{name}_before".to_sym, lambda { |time|
|
25
25
|
{ :conditions => ["#{quoted_table_name}.#{name} <= ?", time] }
|
26
26
|
}
|
27
|
-
|
27
|
+
scope "#{name}_after".to_sym, lambda { |time|
|
28
28
|
{ :conditions => ["#{quoted_table_name}.#{name} >= ?", time] }
|
29
29
|
}
|
30
30
|
end
|
31
31
|
|
32
32
|
def define_past_future_scopes(name)
|
33
|
-
|
33
|
+
scope "#{name}_in_past", lambda {
|
34
34
|
{ :conditions => ["#{quoted_table_name}.#{name} <= ?", now] }
|
35
35
|
}
|
36
|
-
|
36
|
+
scope "#{name}_in_future", lambda {
|
37
37
|
{ :conditions => ["#{quoted_table_name}.#{name} >= ?", now] }
|
38
38
|
}
|
39
39
|
end
|
40
40
|
|
41
41
|
def define_inside_outside_scopes(name)
|
42
|
-
|
42
|
+
scope "#{name}_inside".to_sym, lambda { |start, stop|
|
43
43
|
{ :conditions => ["#{quoted_table_name}.#{name} >= ? and #{quoted_table_name}.#{name} <= ?", start, stop] }
|
44
44
|
}
|
45
|
-
|
45
|
+
scope "#{name}_outside".to_sym, lambda { |start, stop|
|
46
46
|
{ :conditions => ["#{quoted_table_name}.#{name} <= ? and #{quoted_table_name}.#{name} >= ?", start, stop] }
|
47
47
|
}
|
48
48
|
end
|
49
49
|
|
50
50
|
def define_in_date_scopes(name)
|
51
|
-
|
51
|
+
scope "#{name}_in_year".to_sym, lambda { |year|
|
52
52
|
{ :conditions => ["year(#{quoted_table_name}.#{name}) = ?", year] }
|
53
53
|
}
|
54
|
-
|
54
|
+
scope "#{name}_in_month".to_sym, lambda { |month|
|
55
55
|
{ :conditions => ["month(#{quoted_table_name}.#{name}) = ?", month] }
|
56
56
|
}
|
57
|
-
|
57
|
+
scope "#{name}_in_day".to_sym, lambda { |day|
|
58
58
|
{ :conditions => ["day(#{quoted_table_name}.#{name}) = ?", day] }
|
59
59
|
}
|
60
60
|
end
|
data/lib/pacecar/duration.rb
CHANGED
@@ -12,13 +12,13 @@ module Pacecar
|
|
12
12
|
protected
|
13
13
|
|
14
14
|
def define_duration_scopes
|
15
|
-
|
15
|
+
scope :with_duration_of, lambda { |duration, start, stop|
|
16
16
|
{ :conditions => ["datediff(#{quoted_table_name}.#{start}, #{quoted_table_name}.#{stop}) = ?", duration] }
|
17
17
|
}
|
18
|
-
|
18
|
+
scope :with_duration_over, lambda { |duration, start, stop|
|
19
19
|
{ :conditions => ["datediff(#{quoted_table_name}.#{start}, #{quoted_table_name}.#{stop}) > ?", duration] }
|
20
20
|
}
|
21
|
-
|
21
|
+
scope :with_duration_under, lambda { |duration, start, stop|
|
22
22
|
{ :conditions => ["datediff(#{quoted_table_name}.#{start}, #{quoted_table_name}.#{stop}) < ?", duration] }
|
23
23
|
}
|
24
24
|
end
|
data/lib/pacecar/limit.rb
CHANGED
@@ -12,7 +12,7 @@ module Pacecar
|
|
12
12
|
protected
|
13
13
|
|
14
14
|
def define_limit_scopes
|
15
|
-
|
15
|
+
scope :limited, lambda { |*args|
|
16
16
|
{ :limit => args.flatten.first || (defined?(per_page) ? per_page : Pacecar::Helpers.options[:default_limit]) }
|
17
17
|
}
|
18
18
|
end
|
data/lib/pacecar/order.rb
CHANGED
@@ -13,7 +13,7 @@ module Pacecar
|
|
13
13
|
|
14
14
|
def define_order_scopes
|
15
15
|
safe_columns.collect(&:name).each do |name|
|
16
|
-
|
16
|
+
scope "by_#{name}".to_sym, lambda { |*args|
|
17
17
|
{ :order => "#{quoted_table_name}.#{name} #{args.flatten.first || 'asc'}" }
|
18
18
|
}
|
19
19
|
end
|
data/lib/pacecar/polymorph.rb
CHANGED
data/lib/pacecar/presence.rb
CHANGED
@@ -13,8 +13,8 @@ module Pacecar
|
|
13
13
|
|
14
14
|
def define_presence_scopes
|
15
15
|
column_names_without_type(:boolean).each do |name|
|
16
|
-
|
17
|
-
|
16
|
+
scope "#{name}_present".to_sym, :conditions => "#{quoted_table_name}.#{name} is not null"
|
17
|
+
scope "#{name}_missing".to_sym, :conditions => "#{quoted_table_name}.#{name} is null"
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
data/lib/pacecar/ranking.rb
CHANGED
@@ -14,7 +14,7 @@ module Pacecar
|
|
14
14
|
protected
|
15
15
|
|
16
16
|
def define_ranking_scope(association, name, direction)
|
17
|
-
|
17
|
+
scope "#{name}_#{association}",
|
18
18
|
:joins => "inner join #{association} on #{association}.#{reflections[association].primary_key_name} = #{quoted_table_name}.#{primary_key}",
|
19
19
|
:select => "#{quoted_table_name}.*, count(#{quoted_table_name}.#{primary_key}) as #{association}_count",
|
20
20
|
:group => "#{association}.#{reflections[association].primary_key_name}",
|
data/lib/pacecar/search.rb
CHANGED
@@ -14,25 +14,25 @@ module Pacecar
|
|
14
14
|
|
15
15
|
def define_search_scopes
|
16
16
|
safe_column_names.each do |name|
|
17
|
-
|
17
|
+
scope "#{name}_equals".to_sym, lambda { |query|
|
18
18
|
{ :conditions => ["#{quoted_table_name}.#{name} = :query", { :query => query }] }
|
19
19
|
}
|
20
20
|
end
|
21
21
|
text_and_string_column_names.each do |name|
|
22
|
-
|
22
|
+
scope "#{name}_matches".to_sym, lambda { |query|
|
23
23
|
{ :conditions => ["#{quoted_table_name}.#{name} like :query", { :query => "%#{query}%" }] }
|
24
24
|
}
|
25
|
-
|
25
|
+
scope "#{name}_starts_with".to_sym, lambda { |query|
|
26
26
|
{ :conditions => ["#{quoted_table_name}.#{name} like :query", { :query => "#{query}%" }] }
|
27
27
|
}
|
28
|
-
|
28
|
+
scope "#{name}_ends_with".to_sym, lambda { |query|
|
29
29
|
{ :conditions => ["#{quoted_table_name}.#{name} like :query", { :query => "%#{query}" }] }
|
30
30
|
}
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
def define_basic_search_scope
|
35
|
-
|
35
|
+
scope :search_for, lambda { |*args|
|
36
36
|
opts = args.extract_options!
|
37
37
|
query = args.flatten.first
|
38
38
|
columns = opts[:on] || non_state_text_and_string_columns
|
data/lib/pacecar/state.rb
CHANGED
@@ -11,8 +11,8 @@ module Pacecar
|
|
11
11
|
names.each do |name|
|
12
12
|
constant = opts[:with] || const_get(name.to_s.pluralize.upcase)
|
13
13
|
constant.each do |state|
|
14
|
-
|
15
|
-
|
14
|
+
scope "#{name}_#{state.downcase}".to_sym, :conditions => ["#{quoted_table_name}.#{name} = ?", state]
|
15
|
+
scope "#{name}_not_#{state.downcase}".to_sym, :conditions => ["#{quoted_table_name}.#{name} <> ?", state]
|
16
16
|
self.class_eval %Q{
|
17
17
|
def #{name}_#{state.downcase}?
|
18
18
|
#{name} == '#{state}'
|
@@ -22,10 +22,10 @@ module Pacecar
|
|
22
22
|
end
|
23
23
|
}
|
24
24
|
end
|
25
|
-
|
25
|
+
scope "#{name}".to_sym, lambda { |state|
|
26
26
|
{ :conditions => ["#{quoted_table_name}.#{name} = ?", state] }
|
27
27
|
}
|
28
|
-
|
28
|
+
scope "#{name}_not".to_sym, lambda { |state|
|
29
29
|
{ :conditions => ["#{quoted_table_name}.#{name} <> ?", state] }
|
30
30
|
}
|
31
31
|
end
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pacecar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 1.3.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Matt Jankowski
|
@@ -9,7 +15,7 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-06-11 00:00:00 -04:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
@@ -48,23 +54,29 @@ rdoc_options: []
|
|
48
54
|
require_paths:
|
49
55
|
- lib
|
50
56
|
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ">="
|
53
60
|
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 0
|
54
64
|
version: "0"
|
55
|
-
version:
|
56
65
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
57
67
|
requirements:
|
58
68
|
- - ">="
|
59
69
|
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
60
73
|
version: "0"
|
61
|
-
version:
|
62
74
|
requirements: []
|
63
75
|
|
64
76
|
rubyforge_project:
|
65
|
-
rubygems_version: 1.3.
|
77
|
+
rubygems_version: 1.3.7
|
66
78
|
signing_key:
|
67
79
|
specification_version: 3
|
68
|
-
summary: Pacecar adds
|
80
|
+
summary: Pacecar adds scope methods to ActiveRecord classes via database column introspection.
|
69
81
|
test_files: []
|
70
82
|
|