livelist-rails 0.0.5 → 0.0.6

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/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ # 0.0.6
2
+ * cache counts query per filter, per request
3
+ * cache option_objects query per filter, per request
4
+ * fix a bug where counts weren't updating on filter selection change in
5
+ some cases
6
+ * refactor
@@ -6,135 +6,152 @@ module Livelist
6
6
 
7
7
  def filters(*filter_slugs)
8
8
  @@filter_slugs = filter_slugs
9
+ @@counts = {}
10
+ @@option_objects = {}
11
+
9
12
  @@filter_slugs.each do |filter_slug|
10
- filter_slug = filter_slug.to_s
11
- metaclass = class << self; self; end
13
+ define_class_methods(filter_slug)
14
+ end
12
15
 
13
- metaclass.instance_eval do
14
- define_method "#{filter_slug}_filter_name" do
15
- filter_slug.capitalize
16
- end
16
+ def filters_as_json(filter_params)
17
+ @@filter_params = filter_params || {}
18
+ @@filter_slugs.map do |filter|
19
+ filter_options = send("#{filter}_filters", filter)
20
+ send("#{filter}_filter", filter_options)
21
+ end
22
+ end
17
23
 
18
- define_method "#{filter_slug}_filter_slug" do
19
- filter_slug
20
- end
24
+ def filter_relation(filter_params)
25
+ relation = scoped
26
+ filter_params.each do |filter, values|
27
+ relation = relation.send("#{filter}_relation", values)
28
+ end
29
+ relation
30
+ end
21
31
 
22
- define_method "#{filter_slug}_filter" do |options|
23
- {
24
- :filter_slug => send("#{filter_slug}_filter_slug"),
25
- :name => send("#{filter_slug}_filter_name"),
26
- :options => options
27
- }
28
- end
32
+ def filter(filter_params)
33
+ filter_params ||= {}
34
+ @@filter_relation = filter_relation(filter_params)
35
+ end
29
36
 
30
- define_method "#{filter_slug}_filter_option_key_name" do
31
- new.respond_to?(filter_slug.to_sym) ? filter_slug.to_sym : :id
32
- end
37
+ def filter_option_count(filter_slug, option)
38
+ @@counts[filter_slug] = send("#{filter_slug}_filter_counts") unless @@counts.has_key?(filter_slug)
39
+ @@counts[filter_slug][option.to_s] || 0
40
+ end
33
41
 
34
- define_method "#{filter_slug}_filter_option_objects" do
35
- select("distinct #{filter_slug}").all
36
- end
42
+ def cached_option_objects(filter_slug)
43
+ @@option_objects[filter_slug] = send("#{filter_slug}_filter_option_objects") unless @@option_objects.has_key?(filter_slug)
44
+ @@option_objects[filter_slug]
45
+ end
46
+ end
37
47
 
38
- define_method "#{filter_slug}_filter_values" do
39
- key = send("#{filter_slug}_filter_option_key_name")
40
- option_objects = send("#{filter_slug}_filter_option_objects")
41
- if option_objects.any?{|object| object.kind_of?(Hash) && object.has_key?(key)}
42
- option_objects.map{|object| object[key]}
43
- elsif option_objects.any?{|object| object.respond_to?(key)}
44
- option_objects.map(&key)
45
- end
46
- end
48
+ def define_class_methods(filter_slug)
49
+ filter_slug = filter_slug.to_s
50
+ metaclass = class << self; self; end
47
51
 
48
- define_method "#{filter_slug}_filter_counts" do
49
- group(filter_slug).count
50
- end
52
+ metaclass.instance_eval do
53
+ define_method "#{filter_slug}_filter_name" do
54
+ filter_slug.capitalize
55
+ end
51
56
 
52
- define_method "#{filter_slug}_filter_option_slug" do |option|
53
- if [String, Integer].any?{|klass| option.kind_of?(klass)}
54
- option.to_s
55
- else
56
- option.send(:id).to_s
57
- end
58
- end
57
+ define_method "#{filter_slug}_filter_slug" do
58
+ filter_slug
59
+ end
59
60
 
60
- define_method "#{filter_slug}_filter_option_name" do |option|
61
- option_objects = send("#{filter_slug}_filter_option_objects")
62
- if option_objects.any?{|object| object.kind_of?(Hash) && object.has_key?(:name)}
63
- option_object = option_objects.detect{|object| object[:state] == option.to_s}
64
- option_object[:name]
65
- elsif option_objects.any?{|object| object.respond_to?(:name)}
66
- option_object = option_objects.detect{|object| object.send(:id).to_s == option.to_s}
67
- option_object.send(:name)
68
- else
69
- option.to_s
70
- end
71
- end
61
+ define_method "#{filter_slug}_filter" do |options|
62
+ {
63
+ :filter_slug => send("#{filter_slug}_filter_slug"),
64
+ :name => send("#{filter_slug}_filter_name"),
65
+ :options => options
66
+ }
67
+ end
72
68
 
73
- define_method "#{filter_slug}_filter_option_value" do |option|
74
- if [String, Integer].any?{|klass| option.kind_of?(klass)}
75
- option.to_s
76
- else
77
- option.send(:id).to_s
78
- end
79
- end
69
+ define_method "#{filter_slug}_filter_option_key_name" do
70
+ new.respond_to?(filter_slug.to_sym) ? filter_slug.to_sym : :id
71
+ end
80
72
 
81
- define_method "#{filter_slug}_filter_option_count" do |option|
82
- unless class_variables.include?("@@#{filter_slug}_filter_counts")
83
- class_variable_set(:"@@#{filter_slug}_filter_counts", send("#{filter_slug}_filter_counts"))
84
- end
85
- class_variable_get(:"@@#{filter_slug}_filter_counts")[option.to_s] || 0
86
- end
73
+ define_method "#{filter_slug}_filter_option_objects" do
74
+ select("distinct #{filter_slug}").all
75
+ end
87
76
 
88
- define_method "#{filter_slug}_filter_option" do |option, selected|
89
- option_slug = send("#{filter_slug}_filter_option_slug", option)
90
- option_name = send("#{filter_slug}_filter_option_name", option)
91
- option_value = send("#{filter_slug}_filter_option_value", option)
92
- option_count = send("#{filter_slug}_filter_option_count", option)
93
-
94
- {
95
- :slug => option_slug,
96
- :name => option_name,
97
- :value => option_value,
98
- :count => option_count,
99
- :selected => selected
100
- }
77
+ define_method "#{filter_slug}_filter_values" do
78
+ key = send("#{filter_slug}_filter_option_key_name")
79
+ option_objects = cached_option_objects(filter_slug)
80
+ if option_objects.any?{|object| object.kind_of?(Hash) && object.has_key?(key)}
81
+ option_objects.map{|object| object[key]}
82
+ elsif option_objects.any?{|object| object.respond_to?(key)}
83
+ option_objects.map(&key)
101
84
  end
85
+ end
102
86
 
103
- define_method "#{filter_slug}_filter_option_selected?" do |filter_params, option|
104
- filter_params.nil? ? false : filter_params.include?(option.to_s)
87
+ define_method "#{filter_slug}_filter_counts" do
88
+ ::Rails.logger.error "*"*100
89
+ ::Rails.logger.error "*"*100
90
+ ::Rails.logger.error "*"*100
91
+ ::Rails.logger.error group(filter_slug).count.inspect
92
+ ::Rails.logger.error @@filter_relation.group(filter_slug).count.inspect
93
+ @@filter_relation.group(filter_slug).count
94
+ end
95
+
96
+ define_method "#{filter_slug}_filter_option_slug" do |option|
97
+ if [String, Integer].any?{|klass| option.kind_of?(klass)}
98
+ option.to_s
99
+ else
100
+ option.send(:id).to_s
105
101
  end
102
+ end
106
103
 
107
- define_method "#{filter_slug}_filters" do |filter_params|
108
- send("#{filter_slug}_filter_values").map do |option|
109
- selected = send("#{filter_slug}_filter_option_selected?", filter_params, option)
110
- send("#{filter_slug}_filter_option", option, selected)
111
- end
104
+ define_method "#{filter_slug}_filter_option_name" do |option|
105
+ option_objects = cached_option_objects(filter_slug)
106
+ if option_objects.any?{|object| object.kind_of?(Hash) && object.has_key?(:name)}
107
+ option_object = option_objects.detect{|object| object[:state] == option.to_s}
108
+ option_object[:name]
109
+ elsif option_objects.any?{|object| object.respond_to?(:name)}
110
+ option_object = option_objects.detect{|object| object.send(:id).to_s == option.to_s}
111
+ option_object.send(:name)
112
+ else
113
+ option.to_s
112
114
  end
115
+ end
113
116
 
114
- define_method "#{filter_slug}_relation" do |values|
115
- where(model_name.to_s.tableize => { filter_slug => values })
117
+ define_method "#{filter_slug}_filter_option_value" do |option|
118
+ if [String, Integer].any?{|klass| option.kind_of?(klass)}
119
+ option.to_s
120
+ else
121
+ option.send(:id).to_s
116
122
  end
117
123
  end
118
- end
119
124
 
120
- def self.filters_as_json(filter_params)
121
- filter_params ||= {}
122
- @@filter_slugs.map do |filter|
123
- filter_options = send("#{filter}_filters", filter_params[filter])
124
- send("#{filter}_filter", filter_options)
125
+ define_method "#{filter_slug}_filter_option_count" do |option|
126
+ filter_option_count(filter_slug, option)
125
127
  end
126
- end
127
128
 
128
- def self.filter(filter_params)
129
- filter_params ||= {}
130
- query = scoped
131
- filter_params.each do |filter, values|
132
- query = query.send("#{filter}_relation", values)
129
+ define_method "#{filter_slug}_filter_option" do |option, selected|
130
+ {
131
+ :slug => send("#{filter_slug}_filter_option_slug", option),
132
+ :name => send("#{filter_slug}_filter_option_name", option),
133
+ :value => send("#{filter_slug}_filter_option_value", option),
134
+ :count => send("#{filter_slug}_filter_option_count", option),
135
+ :selected => selected
136
+ }
137
+ end
138
+
139
+ define_method "#{filter_slug}_filter_option_selected?" do |filter, option|
140
+ @@filter_params[filter].nil? ? false : @@filter_params[filter].include?(option.to_s)
141
+ end
142
+
143
+ define_method "#{filter_slug}_filters" do |filter|
144
+ send("#{filter_slug}_filter_values").map do |option|
145
+ selected = send("#{filter_slug}_filter_option_selected?", filter, option)
146
+ send("#{filter_slug}_filter_option", option, selected)
147
+ end
148
+ end
149
+
150
+ define_method "#{filter_slug}_relation" do |values|
151
+ where(model_name.to_s.tableize => { filter_slug => values })
133
152
  end
134
- query
135
153
  end
136
154
  end
137
-
138
155
  end
139
156
  end
140
157
  end
@@ -1,6 +1,6 @@
1
1
  module Livelist
2
2
  module Rails
3
- VERSION = '0.0.5'
3
+ VERSION = '0.0.6'
4
4
  LIVELIST_VERSION = '0.0.3'
5
5
  MUSTACHE_VERSION = 'db5f5ece0b6c87bbb2d0584010b97f8723dde69d'
6
6
  UNDERSCORE_VERSION = '1.2.3'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: livelist-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-25 00:00:00.000000000Z
12
+ date: 2012-01-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &22782620 !ruby/object:Gem::Requirement
16
+ requirement: &14627060 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *22782620
24
+ version_requirements: *14627060
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
27
- requirement: &22782200 !ruby/object:Gem::Requirement
27
+ requirement: &14626640 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *22782200
35
+ version_requirements: *14626640
36
36
  description: ! 'livelist-rails is a Rails 3.1 Engine/Extensiont incorporating the
37
37
  following javascript libraries: Mustache.js, underscore.js, jQuery and livelist.js,
38
38
  and providing ActiveRecord filtering extenstions.'
@@ -44,6 +44,7 @@ extra_rdoc_files: []
44
44
  files:
45
45
  - .gitignore
46
46
  - .rspec
47
+ - CHANGELOG.md
47
48
  - Gemfile
48
49
  - README.md
49
50
  - Rakefile
@@ -83,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
84
  version: '0'
84
85
  requirements: []
85
86
  rubyforge_project: livelist-rails
86
- rubygems_version: 1.8.15
87
+ rubygems_version: 1.8.10
87
88
  signing_key:
88
89
  specification_version: 3
89
90
  summary: A Rails Engine/Extension Incorporating Livelist.js