weighted_average 0.0.4 → 0.0.5
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 +21 -12
- data/Rakefile +0 -1
- data/VERSION +1 -1
- data/lib/weighted_average.rb +16 -12
- metadata +23 -25
data/README.rdoc
CHANGED
@@ -1,20 +1,29 @@
|
|
1
1
|
= weighted_average
|
2
2
|
|
3
|
-
|
3
|
+
Do weighted averages in ActiveRecord.
|
4
4
|
|
5
|
-
|
5
|
+
== Rationale
|
6
6
|
|
7
|
-
|
7
|
+
You have a bunch of flight records with passenger count and distance.
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
* Flight EWR <-> MSN; 30,000 passengers last month; 500 miles
|
10
|
+
* Flight EWR <-> BOM; 15 passengers last month; 10,000 miles
|
11
|
+
|
12
|
+
The average distance is <tt>(10_000 + 500) / 2 = 5250</tt>.
|
13
|
+
|
14
|
+
The average distance weighted by passenger count is <tt>(30_000 * 500 + 15 * 10_000) / (10_500) = 1442</tt>.
|
15
|
+
|
16
|
+
== Usage
|
17
|
+
|
18
|
+
Using <tt>FlightSegment</tt> from {Brighter Planet's}[http://brighterplanet.com] {earth gem}[http://rubygems.org/gems/earth]:
|
19
|
+
|
20
|
+
>> FlightSegment.weighted_average(:distance, :weighted_by => :passengers)
|
21
|
+
=> 2436.1959
|
22
|
+
|
23
|
+
You can also see the SQL that is generated:
|
24
|
+
|
25
|
+
>> FlightSegment.weighted_average_relation(:distance, :weighted_by => :passengers).to_sql
|
26
|
+
=> "SELECT (SUM((`flight_segments`.`distance`) * `flight_segments`.`passengers`) / SUM(`flight_segments`.`passengers`)) AS weighted_average FROM `flight_segments` WHERE (`flight_segments`.`distance` IS NOT NULL)"
|
18
27
|
|
19
28
|
== Copyright
|
20
29
|
|
data/Rakefile
CHANGED
@@ -11,7 +11,6 @@ begin
|
|
11
11
|
gem.homepage = "http://github.com/seamusabshere/weighted_average"
|
12
12
|
gem.authors = ["Seamus Abshere", "Andy Rossmeissl", "Ian Hough", "Matt Kling"]
|
13
13
|
gem.add_dependency 'activerecord', '>=3.0.0.beta2'
|
14
|
-
gem.add_dependency 'activesupport', '>=3.0.0.beta2'
|
15
14
|
gem.add_dependency 'arel', '>=0.3.3'
|
16
15
|
gem.add_development_dependency 'cohort_scope', '>=0.0.2'
|
17
16
|
gem.add_development_dependency "shoulda", ">= 2.10.3"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
data/lib/weighted_average.rb
CHANGED
@@ -1,19 +1,12 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
require 'active_support'
|
3
|
-
require 'active_support/version'
|
4
|
-
%w{
|
5
|
-
active_support/core_ext/module
|
6
|
-
}.each do |active_support_3_requirement|
|
7
|
-
require active_support_3_requirement
|
8
|
-
end if ActiveSupport::VERSION::MAJOR == 3
|
9
2
|
|
10
3
|
module WeightedAverage
|
11
|
-
# Returns a number
|
4
|
+
# Returns a number.
|
12
5
|
def weighted_average(*args)
|
13
6
|
connection.select_value(weighted_average_relation(*args).to_sql, 'weighted_average').to_f
|
14
7
|
end
|
15
8
|
|
16
|
-
# Returns the ARel relation
|
9
|
+
# Returns the ARel relation for a weighted average query.
|
17
10
|
def weighted_average_relation(column_names, options = {})
|
18
11
|
raise ArgumentError, "Only use array form if the weighting column in the foreign table is not called 'weighting'" if options[:weighted_by].is_a?(Array) and options[:weighted_by].length != 2
|
19
12
|
raise ArgumentError, "No nil values in weighted_by, please" if Array.wrap(options[:weighted_by]).any?(&:nil?)
|
@@ -64,11 +57,22 @@ module WeightedAverage
|
|
64
57
|
end
|
65
58
|
|
66
59
|
ActiveRecord::Associations::AssociationCollection.class_eval do
|
67
|
-
|
60
|
+
def self.weighted_average(*args) # :nodoc:
|
61
|
+
scoped.weighted_average(*args)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.weighted_average_relation(*args) # :nodoc:
|
65
|
+
scoped.weighted_average_relation(*args)
|
66
|
+
end
|
68
67
|
end
|
69
68
|
ActiveRecord::Base.class_eval do
|
70
|
-
|
71
|
-
|
69
|
+
def self.weighted_average(*args) # :nodoc:
|
70
|
+
scoped.weighted_average(*args)
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.weighted_average_relation(*args) # :nodoc:
|
74
|
+
scoped.weighted_average_relation(*args)
|
72
75
|
end
|
73
76
|
end
|
77
|
+
|
74
78
|
ActiveRecord::Relation.send :include, WeightedAverage
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weighted_average
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 21
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Seamus Abshere
|
@@ -17,16 +18,18 @@ autorequire:
|
|
17
18
|
bindir: bin
|
18
19
|
cert_chain: []
|
19
20
|
|
20
|
-
date: 2010-
|
21
|
+
date: 2010-09-20 00:00:00 -05:00
|
21
22
|
default_executable:
|
22
23
|
dependencies:
|
23
24
|
- !ruby/object:Gem::Dependency
|
24
25
|
name: activerecord
|
25
26
|
prerelease: false
|
26
27
|
requirement: &id001 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
27
29
|
requirements:
|
28
30
|
- - ">="
|
29
31
|
- !ruby/object:Gem::Version
|
32
|
+
hash: 299253626
|
30
33
|
segments:
|
31
34
|
- 3
|
32
35
|
- 0
|
@@ -35,63 +38,54 @@ dependencies:
|
|
35
38
|
version: 3.0.0.beta2
|
36
39
|
type: :runtime
|
37
40
|
version_requirements: *id001
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: activesupport
|
40
|
-
prerelease: false
|
41
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
-
requirements:
|
43
|
-
- - ">="
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
segments:
|
46
|
-
- 3
|
47
|
-
- 0
|
48
|
-
- 0
|
49
|
-
- beta2
|
50
|
-
version: 3.0.0.beta2
|
51
|
-
type: :runtime
|
52
|
-
version_requirements: *id002
|
53
41
|
- !ruby/object:Gem::Dependency
|
54
42
|
name: arel
|
55
43
|
prerelease: false
|
56
|
-
requirement: &
|
44
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
57
46
|
requirements:
|
58
47
|
- - ">="
|
59
48
|
- !ruby/object:Gem::Version
|
49
|
+
hash: 21
|
60
50
|
segments:
|
61
51
|
- 0
|
62
52
|
- 3
|
63
53
|
- 3
|
64
54
|
version: 0.3.3
|
65
55
|
type: :runtime
|
66
|
-
version_requirements: *
|
56
|
+
version_requirements: *id002
|
67
57
|
- !ruby/object:Gem::Dependency
|
68
58
|
name: cohort_scope
|
69
59
|
prerelease: false
|
70
|
-
requirement: &
|
60
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
71
62
|
requirements:
|
72
63
|
- - ">="
|
73
64
|
- !ruby/object:Gem::Version
|
65
|
+
hash: 27
|
74
66
|
segments:
|
75
67
|
- 0
|
76
68
|
- 0
|
77
69
|
- 2
|
78
70
|
version: 0.0.2
|
79
71
|
type: :development
|
80
|
-
version_requirements: *
|
72
|
+
version_requirements: *id003
|
81
73
|
- !ruby/object:Gem::Dependency
|
82
74
|
name: shoulda
|
83
75
|
prerelease: false
|
84
|
-
requirement: &
|
76
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
85
78
|
requirements:
|
86
79
|
- - ">="
|
87
80
|
- !ruby/object:Gem::Version
|
81
|
+
hash: 33
|
88
82
|
segments:
|
89
83
|
- 2
|
90
84
|
- 10
|
91
85
|
- 3
|
92
86
|
version: 2.10.3
|
93
87
|
type: :development
|
94
|
-
version_requirements: *
|
88
|
+
version_requirements: *id004
|
95
89
|
description: Perform weighted averages, even across associations. Rails 3 only because it uses ARel.
|
96
90
|
email: seamus@abshere.net
|
97
91
|
executables: []
|
@@ -121,23 +115,27 @@ rdoc_options:
|
|
121
115
|
require_paths:
|
122
116
|
- lib
|
123
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
124
119
|
requirements:
|
125
120
|
- - ">="
|
126
121
|
- !ruby/object:Gem::Version
|
122
|
+
hash: 3
|
127
123
|
segments:
|
128
124
|
- 0
|
129
125
|
version: "0"
|
130
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
131
128
|
requirements:
|
132
129
|
- - ">="
|
133
130
|
- !ruby/object:Gem::Version
|
131
|
+
hash: 3
|
134
132
|
segments:
|
135
133
|
- 0
|
136
134
|
version: "0"
|
137
135
|
requirements: []
|
138
136
|
|
139
137
|
rubyforge_project:
|
140
|
-
rubygems_version: 1.3.
|
138
|
+
rubygems_version: 1.3.7
|
141
139
|
signing_key:
|
142
140
|
specification_version: 3
|
143
141
|
summary: Perform weighted averages. Rails 3 only.
|