acts_as_saveable 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,131 @@
1
+ module ActsAsSaveable
2
+ module Saver
3
+
4
+ def self.included(base)
5
+
6
+ # allow user to define these
7
+ aliases = {
8
+ :save_up_for => [:likes, :upsaves, :up_saves],
9
+ :save_down_for => [:dislikes, :downsaves, :down_saves],
10
+ :saved_on? => [:saved_for?],
11
+ :saved_up_on? => [:saved_up_for?],
12
+ :saved_down_on? => [:saved_down_for?],
13
+ :saved_as_when_saving_on => [:saved_as_when_saved_on, :saved_as_when_saving_for, :saved_as_when_saved_for],
14
+ }
15
+
16
+ base.class_eval do
17
+
18
+ has_many :saves, :class_name => 'ActsAsSaveable::Save', :as => :saver, :dependent => :destroy do
19
+ def saveables
20
+ includes(:saveable).map(&:saveable)
21
+ end
22
+ end
23
+
24
+ aliases.each do |method, links|
25
+ links.each do |new_method|
26
+ alias_method(new_method, method)
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ # saving
35
+ def saved args
36
+ args[:saveable].save_by args.merge({:saver => self})
37
+ end
38
+
39
+ def save_up_for model=nil, args={}
40
+ saved :saveable => model, :save_scope => args[:save_scope], :saved => true
41
+ end
42
+
43
+ def save_down_for model=nil, args={}
44
+ saved :saveable => model, :save_scope => args[:save_scope], :saved => false
45
+ end
46
+
47
+ def unsave_for model, args={}
48
+ model.unsaved :saver => self, :save_scope => args[:save_scope]
49
+ end
50
+
51
+ # results
52
+ def saved_on? saveable, args={}
53
+ saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
54
+ :save_scope => args[:save_scope])
55
+ saves.size > 0
56
+ end
57
+
58
+ def saved_up_on? saveable, args={}
59
+ saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
60
+ :save_scope => args[:save_scope], :save_flag => true)
61
+ saves.size > 0
62
+ end
63
+
64
+ def saved_down_on? saveable, args={}
65
+ saves = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
66
+ :save_scope => args[:save_scope], :save_flag => false)
67
+ saves.size > 0
68
+ end
69
+
70
+ def saved_as_when_saving_on saveable, args={}
71
+ saved = find_saves(:saveable_id => saveable.id, :saveable_type => saveable.class.base_class.name,
72
+ :save_scope => args[:save_scope]).select(:save_flag).last
73
+ return nil unless saved
74
+ return saved.save_flag
75
+ end
76
+
77
+ def find_saves extra_conditions = {}
78
+ saves.where(extra_conditions)
79
+ end
80
+
81
+ def find_up_saves args={}
82
+ find_saves :save_flag => true, :save_scope => args[:save_scope]
83
+ end
84
+
85
+ def find_down_saves args={}
86
+ find_saves :save_flag => false, :save_scope => args[:save_scope]
87
+ end
88
+
89
+ def find_saves_for_class klass, extra_conditions = {}
90
+ find_saves extra_conditions.merge({:saveable_type => klass.name})
91
+ end
92
+
93
+ def find_up_saves_for_class klass, args={}
94
+ find_saves_for_class klass, :save_flag => true, :save_scope => args[:save_scope]
95
+ end
96
+
97
+ def find_down_saves_for_class klass, args={}
98
+ find_saves_for_class klass, :save_flag => false, :save_scope => args[:save_scope]
99
+ end
100
+
101
+ # Including polymporphic relations for eager loading
102
+ def include_objects
103
+ ActsAsSaveable::Save.includes(:saveable)
104
+ end
105
+
106
+ def find_saved_items extra_conditions = {}
107
+ options = extra_conditions.merge :saver_id => id, :saver_type => self.class.base_class.name
108
+ include_objects.where(options).collect(&:saveable)
109
+ end
110
+
111
+ def find_up_saved_items extra_conditions = {}
112
+ find_saved_items extra_conditions.merge(:save_flag => true)
113
+ end
114
+
115
+ def find_down_saved_items extra_conditions = {}
116
+ find_saved_items extra_conditions.merge(:save_flag => false)
117
+ end
118
+
119
+ def get_saved klass, extra_conditions = {}
120
+ klass.joins(:saves_for).merge find_saves(extra_conditions)
121
+ end
122
+
123
+ def get_up_saved klass
124
+ klass.joins(:saves_for).merge find_up_saves
125
+ end
126
+
127
+ def get_down_saved klass
128
+ klass.joins(:saves_for).merge find_down_saves
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,3 @@
1
+ module ActsAsSaveable
2
+ VERSION = "0.10.1"
3
+ end
@@ -0,0 +1,31 @@
1
+ require 'rails/generators/migration'
2
+
3
+ module ActsAsSaveable
4
+ class MigrationGenerator < Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+
7
+ desc "Generates migration for saveable (saves table)"
8
+
9
+ def self.orm
10
+ Rails::Generators.options[:rails][:orm]
11
+ end
12
+
13
+ def self.source_root
14
+ File.join(File.dirname(__FILE__), 'templates', (orm.to_s unless orm.class.eql?(String)) )
15
+ end
16
+
17
+ def self.orm_has_migration?
18
+ [:active_record].include? orm
19
+ end
20
+
21
+ def self.next_migration_number(path)
22
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
23
+ end
24
+
25
+ def create_migration_file
26
+ if self.class.orm_has_migration?
27
+ migration_template 'migration.rb', 'db/migrate/acts_as_saveable_migration.rb'
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ class ActsAsSaveableMigration < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :saves do |t|
4
+
5
+ t.references :saveable, :polymorphic => true
6
+ t.references :saver, :polymorphic => true
7
+
8
+ t.boolean :save_flag
9
+ t.string :save_scope
10
+ t.integer :save_weight
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ if ActiveRecord::VERSION::MAJOR < 4
16
+ add_index :saves, [:saveable_id, :saveable_type]
17
+ add_index :saves, [:saver_id, :saver_type]
18
+ end
19
+
20
+ add_index :saves, [:saver_id, :saver_type, :save_scope]
21
+ add_index :saves, [:saveable_id, :saveable_type, :save_scope]
22
+ end
23
+
24
+ def self.down
25
+ drop_table :saves
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ require 'acts_as_saveable'
2
+ require 'spec_helper'
3
+
4
+ describe SaveableSaver do
5
+ it_behaves_like "a saveable_model" do
6
+ # TODO Replace with factories
7
+ let (:saver) { SaveableSaver.create(:name => 'i can saved!') }
8
+ let (:saver2) { SaveableSaver.create(:name => 'a new person') }
9
+ let (:saver3) { Saver.create(:name => 'another person') }
10
+ let (:saveable) { SaveableSaver.create(:name => 'a saving model') }
11
+ let (:saveable_cache) { SaveableCache.create(:name => 'saving model with cache') }
12
+ end
13
+
14
+ it_behaves_like "a saver_model" do
15
+ # TODO Replace with factories
16
+ let (:saver) { SaveableSaver.create(:name => 'i can saved!') }
17
+ let (:saver2) { SaveableSaver.create(:name => 'a new person') }
18
+ let (:saveable) { SaveableSaver.create(:name => 'a saving model') }
19
+ let (:saveable2) { SaveableSaver.create(:name => 'a 2nd saving model') }
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'acts_as_saveable'
2
+ require 'spec_helper'
3
+
4
+ describe ActsAsSaveable::Saveable do
5
+ it "should not be saveable" do
6
+ expect(NotSaveable).not_to be_saveable
7
+ end
8
+
9
+ it "should be saveable" do
10
+ expect(Saveable).to be_saveable
11
+ end
12
+
13
+ it_behaves_like "a saveable_model" do
14
+ # TODO Replace with factories
15
+ let (:saver) { Saver.create(:name =>'i can saved!') }
16
+ let (:saver2) { Saver.create(:name => 'a new person') }
17
+ let (:saver3) { Saver.create(:name => 'another person') }
18
+ let (:saveable) { Saveable.create(:name =>'a saving model') }
19
+ let (:saveable_cache) { SaveableCache.create(:name => 'saving model with cache') }
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'acts_as_saveable'
2
+ require 'spec_helper'
3
+
4
+ describe ActsAsSaveable::Saver do
5
+
6
+ it "should not be a saver" do
7
+ expect(NotSaveable).not_to be_saveable
8
+ end
9
+
10
+ it "should be a saver" do
11
+ expect(Saveable).to be_saveable
12
+ end
13
+
14
+ it_behaves_like "a saver_model" do
15
+ # TODO Replace with factories
16
+ let (:saver) { Saver.create(:name => 'i can saved!') }
17
+ let (:saver2) { Saver.create(:name => 'a new person') }
18
+ let (:saveable) { Saveable.create(:name => 'a saving model') }
19
+ let (:saveable2) { Saveable.create(:name => 'a 2nd saving model') }
20
+ end
21
+ end
@@ -0,0 +1,484 @@
1
+ shared_examples "a saveable_model" do
2
+ it "should return false when a saved with no saver is saved" do
3
+ expect(saveable.save_by).to be false
4
+ end
5
+
6
+ it "should have one saved when saved" do
7
+ saveable.save_by :saver => saver, :saved => 'yes'
8
+ expect(saveable.saves_for.size).to eq(1)
9
+ end
10
+
11
+ it "should have one saved when saved on twice by the same person" do
12
+ saveable.save_by :saver => saver, :saved => 'yes'
13
+ saveable.save_by :saver => saver, :saved => 'no'
14
+ expect(saveable.saves_for.size).to eq(1)
15
+ end
16
+
17
+ it "should have two saves_for when saved on twice by the same person with duplicate paramenter" do
18
+ saveable.save_by :saver => saver, :saved => 'yes'
19
+ saveable.save_by :saver => saver, :saved => 'no', :duplicate => true
20
+ expect(saveable.saves_for.size).to eq(2)
21
+ end
22
+
23
+ it "should have one scoped saved when saving under an scope" do
24
+ saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'rank'
25
+ expect(saveable.find_saves_for(:save_scope => 'rank').size).to eq(1)
26
+ end
27
+
28
+ it "should have one saved when saved on twice using scope by the same person" do
29
+ saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'rank'
30
+ saveable.save_by :saver => saver, :saved => 'no', :save_scope => 'rank'
31
+ expect(saveable.find_saves_for(:save_scope => 'rank').size).to eq(1)
32
+ end
33
+
34
+ it "should have two saves_for when saving on two different scopes by the same person" do
35
+ saveable.save_by :saver => saver, :saved => 'yes', :save_scope => 'weekly_rank'
36
+ saveable.save_by :saver => saver, :saved => 'no', :save_scope => 'monthly_rank'
37
+ expect(saveable.saves_for.size).to eq(2)
38
+ end
39
+
40
+ it "should be callable with save_up" do
41
+ saveable.save_up saver
42
+ expect(saveable.get_up_saves.first.saver).to eq(saver)
43
+ end
44
+
45
+ it "should be callable with save_down" do
46
+ saveable.save_down saver
47
+ expect(saveable.get_down_saves.first.saver).to eq(saver)
48
+ end
49
+
50
+ it "should have 2 saves_for when saved on once by two different people" do
51
+ saveable.save_by :saver => saver
52
+ saveable.save_by :saver => saver2
53
+ expect(saveable.saves_for.size).to eq(2)
54
+ end
55
+
56
+ it "should have one true saved" do
57
+ saveable.save_by :saver => saver
58
+ saveable.save_by :saver => saver2, :saved => 'dislike'
59
+ expect(saveable.get_up_saves.size).to eq(1)
60
+ end
61
+
62
+ it "should have 2 false saves_for" do
63
+ saveable.save_by :saver => saver, :saved => 'no'
64
+ saveable.save_by :saver => saver2, :saved => 'dislike'
65
+ expect(saveable.get_down_saves.size).to eq(2)
66
+ end
67
+
68
+ it "should have been saved on by saver2" do
69
+ saveable.save_by :saver => saver2, :saved => true
70
+ expect(saveable.find_saves_for.first.saver.id).to be saver2.id
71
+ end
72
+
73
+ it "should count the saved as registered if this is the savers first saved" do
74
+ saveable.save_by :saver => saver
75
+ expect(saveable.save_registered?).to be true
76
+ end
77
+
78
+ it "should not count the saved as being registered if that saver has already saved and the saved has not changed" do
79
+ saveable.save_by :saver => saver, :saved => true
80
+ saveable.save_by :saver => saver, :saved => 'yes'
81
+ expect(saveable.save_registered?).to be false
82
+ end
83
+
84
+ it "should count the saved as registered if the saver has saved and the saved flag has changed" do
85
+ saveable.save_by :saver => saver, :saved => true
86
+ saveable.save_by :saver => saver, :saved => 'dislike'
87
+ expect(saveable.save_registered?).to be true
88
+ end
89
+
90
+ it "should count the saved as registered if the saver has saved and the saved weight has changed" do
91
+ saveable.save_by :saver => saver, :saved => true, :save_weight => 1
92
+ saveable.save_by :saver => saver, :saved => true, :save_weight => 2
93
+ expect(saveable.save_registered?).to be true
94
+ end
95
+
96
+ it "should be saved on by saver" do
97
+ saveable.save_by :saver => saver
98
+ expect(saveable.saved_on_by?(saver)).to be true
99
+ end
100
+
101
+ it "should be able to unsaved a saver" do
102
+ saveable.upsaved_by(saver)
103
+ saveable.unsave_by(saver)
104
+ expect(saveable.saved_on_by?(saver)).to be false
105
+ end
106
+
107
+ it "should unsaved a positive saved" do
108
+ saveable.save_by :saver => saver
109
+ saveable.unsaved :saver => saver
110
+ expect(saveable.find_saves_for.count).to eq(0)
111
+ end
112
+
113
+ it "should set the saveable to unregistered after unsaving" do
114
+ saveable.save_by :saver => saver
115
+ saveable.unsaved :saver => saver
116
+ expect(saveable.save_registered?).to be false
117
+ end
118
+
119
+ it "should unsaved a negative saved" do
120
+ saveable.save_by :saver => saver, :saved => 'no'
121
+ saveable.unsaved :saver => saver
122
+ expect(saveable.find_saves_for.count).to eq(0)
123
+ end
124
+
125
+ it "should unsaved only the from a single saver" do
126
+ saveable.save_by :saver => saver
127
+ saveable.save_by :saver => saver2
128
+ saveable.unsaved :saver => saver
129
+ expect(saveable.find_saves_for.count).to eq(1)
130
+ end
131
+
132
+ it "should be contained to instances" do
133
+ saveable2 = Saveable.new(:name => '2nd saveable')
134
+ saveable2.save
135
+
136
+ saveable.save_by :saver => saver, :saved => false
137
+ saveable2.save_by :saver => saver, :saved => true
138
+ saveable2.save_by :saver => saver, :saved => true
139
+
140
+ expect(saveable.save_registered?).to be true
141
+ expect(saveable2.save_registered?).to be false
142
+ end
143
+
144
+ it "should set default saved weight to 1 if not specified" do
145
+ saveable.upsave_by saver
146
+ expect(saveable.find_saves_for.first.save_weight).to eq(1)
147
+ end
148
+
149
+ describe "with cached saves_for" do
150
+
151
+ before(:each) do
152
+ clean_database
153
+ saver = Saver.new(:name => 'i can saved!')
154
+ saver.save
155
+
156
+ saveable = Saveable.new(:name => 'a saving model without a cache')
157
+ saveable.save
158
+
159
+ saveable_cache = SaveableCache.new(:name => 'saving model with cache')
160
+ saveable_cache.save
161
+ end
162
+
163
+ it "should not update cached saves_for if there are no columns" do
164
+ saveable.save_by :saver => saver
165
+ end
166
+
167
+ it "should update cached total saves_for if there is a total column" do
168
+ saveable_cache.cached_saves_total = 50
169
+ saveable_cache.save_by :saver => saver
170
+ expect(saveable_cache.cached_saves_total).to eq(1)
171
+ end
172
+
173
+ it "should update cached total saves_for when a saved up is removed" do
174
+ saveable_cache.save_by :saver => saver, :saved => 'true'
175
+ saveable_cache.unsaved :saver => saver
176
+ expect(saveable_cache.cached_saves_total).to eq(0)
177
+ end
178
+
179
+ it "should update cached total saves_for when a saved down is removed" do
180
+ saveable_cache.save_by :saver => saver, :saved => 'false'
181
+ saveable_cache.unsaved :saver => saver
182
+ expect(saveable_cache.cached_saves_total).to eq(0)
183
+ end
184
+
185
+ it "should update cached score saves_for if there is a score column" do
186
+ saveable_cache.cached_saves_score = 50
187
+ saveable_cache.save_by :saver => saver
188
+ expect(saveable_cache.cached_saves_score).to eq(1)
189
+ saveable_cache.save_by :saver => saver2, :saved => 'false'
190
+ expect(saveable_cache.cached_saves_score).to eq(0)
191
+ saveable_cache.save_by :saver => saver, :saved => 'false'
192
+ expect(saveable_cache.cached_saves_score).to eq(-2)
193
+ end
194
+
195
+ it "should update cached score saves_for when a saved up is removed" do
196
+ saveable_cache.save_by :saver => saver, :saved => 'true'
197
+ expect(saveable_cache.cached_saves_score).to eq(1)
198
+ saveable_cache.unsaved :saver => saver
199
+ expect(saveable_cache.cached_saves_score).to eq(0)
200
+ end
201
+
202
+ it "should update cached score saves_for when a saved down is removed" do
203
+ saveable_cache.save_by :saver => saver, :saved => 'false'
204
+ expect(saveable_cache.cached_saves_score).to eq(-1)
205
+ saveable_cache.unsaved :saver => saver
206
+ expect(saveable_cache.cached_saves_score).to eq(0)
207
+ end
208
+
209
+ it "should update cached weighted total if there is a weighted total column" do
210
+ saveable_cache.cached_weighted_total = 50
211
+ saveable_cache.save_by :saver => saver
212
+ expect(saveable_cache.cached_weighted_total).to eq(1)
213
+ saveable_cache.save_by :saver => saver2, :saved => 'false'
214
+ expect(saveable_cache.cached_weighted_total).to eq(2)
215
+ end
216
+
217
+ it "should update cached weighted total saves_for when a saved up is removed" do
218
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 3
219
+ expect(saveable_cache.cached_weighted_total).to eq(3)
220
+ saveable_cache.unsaved :saver => saver
221
+ expect(saveable_cache.cached_weighted_total).to eq(0)
222
+ end
223
+
224
+ it "should update cached weighted total saves_for when a saved down is removed" do
225
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_weight => 4
226
+ expect(saveable_cache.cached_weighted_total).to eq(4)
227
+ saveable_cache.unsaved :saver => saver
228
+ expect(saveable_cache.cached_weighted_total).to eq(0)
229
+ end
230
+
231
+ it "should update cached weighted score if there is a weighted score column" do
232
+ saveable_cache.cached_weighted_score = 50
233
+ saveable_cache.save_by :saver => saver, :save_weight => 3
234
+ expect(saveable_cache.cached_weighted_score).to eq(3)
235
+ saveable_cache.save_by :saver => saver2, :saved => 'false', :save_weight => 5
236
+ expect(saveable_cache.cached_weighted_score).to eq(-2)
237
+ # saver changes her saved from 3 to 5
238
+ saveable_cache.save_by :saver => saver, :save_weight => 5
239
+ expect(saveable_cache.cached_weighted_score).to eq(0)
240
+ saveable_cache.save_by :saver => saver3, :save_weight => 4
241
+ expect(saveable_cache.cached_weighted_score).to eq(4)
242
+ end
243
+
244
+ it "should update cached weighted score saves_for when a saved up is removed" do
245
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 3
246
+ expect(saveable_cache.cached_weighted_score).to eq(3)
247
+ saveable_cache.unsaved :saver => saver
248
+ expect(saveable_cache.cached_weighted_score).to eq(0)
249
+ end
250
+
251
+ it "should update cached weighted score saves_for when a saved down is removed" do
252
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_weight => 4
253
+ expect(saveable_cache.cached_weighted_score).to eq(-4)
254
+ saveable_cache.unsaved :saver => saver
255
+ expect(saveable_cache.cached_weighted_score).to eq(0)
256
+ end
257
+
258
+ it "should update cached weighted average if there is a weighted average column" do
259
+ saveable_cache.cached_weighted_average = 50.0
260
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 5
261
+ expect(saveable_cache.cached_weighted_average).to eq(5.0)
262
+ saveable_cache.save_by :saver => saver2, :saved => 'true', :save_weight => 3
263
+ expect(saveable_cache.cached_weighted_average).to eq(4.0)
264
+ # saver changes her saved from 5 to 4
265
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 4
266
+ expect(saveable_cache.cached_weighted_average).to eq(3.5)
267
+ saveable_cache.save_by :saver => saver3, :saved => 'true', :save_weight => 5
268
+ expect(saveable_cache.cached_weighted_average).to eq(4.0)
269
+ end
270
+
271
+ it "should update cached weighted average saves_for when a saved up is removed" do
272
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_weight => 5
273
+ saveable_cache.save_by :saver => saver2, :saved => 'true', :save_weight => 3
274
+ expect(saveable_cache.cached_weighted_average).to eq(4)
275
+ saveable_cache.unsaved :saver => saver
276
+ expect(saveable_cache.cached_weighted_average).to eq(3)
277
+ end
278
+
279
+ it "should update cached up saves_for if there is an up saved column" do
280
+ saveable_cache.cached_saves_up = 50
281
+ saveable_cache.save_by :saver => saver
282
+ saveable_cache.save_by :saver => saver
283
+ expect(saveable_cache.cached_saves_up).to eq(1)
284
+ end
285
+
286
+ it "should update cached down saves_for if there is a down saved column" do
287
+ saveable_cache.cached_saves_down = 50
288
+ saveable_cache.save_by :saver => saver, :saved => 'false'
289
+ expect(saveable_cache.cached_saves_down).to eq(1)
290
+ end
291
+
292
+ it "should update cached up saves_for when a saved up is removed" do
293
+ saveable_cache.save_by :saver => saver, :saved => 'true'
294
+ saveable_cache.unsaved :saver => saver
295
+ expect(saveable_cache.cached_saves_up).to eq(0)
296
+ end
297
+
298
+ it "should update cached down saves_for when a saved down is removed" do
299
+ saveable_cache.save_by :saver => saver, :saved => 'false'
300
+ saveable_cache.unsaved :saver => saver
301
+ expect(saveable_cache.cached_saves_down).to eq(0)
302
+ end
303
+
304
+ it "should select from cached total saves_for if there a total column" do
305
+ saveable_cache.save_by :saver => saver
306
+ saveable_cache.cached_saves_total = 50
307
+ expect(saveable_cache.count_saves_total).to eq(50)
308
+ end
309
+
310
+ it "should select from cached up saves_for if there is an up saved column" do
311
+ saveable_cache.save_by :saver => saver
312
+ saveable_cache.cached_saves_up = 50
313
+ expect(saveable_cache.count_saves_up).to eq(50)
314
+ end
315
+
316
+ it "should select from cached down saves_for if there is a down saved column" do
317
+ saveable_cache.save_by :saver => saver, :saved => 'false'
318
+ saveable_cache.cached_saves_down = 50
319
+ expect(saveable_cache.count_saves_down).to eq(50)
320
+ end
321
+
322
+ it "should select from cached weighted total if there is a weighted total column" do
323
+ saveable_cache.save_by :saver => saver, :saved => 'false'
324
+ saveable_cache.cached_weighted_total = 50
325
+ expect(saveable_cache.weighted_total).to eq(50)
326
+ end
327
+
328
+ it "should select from cached weighted score if there is a weighted score column" do
329
+ saveable_cache.save_by :saver => saver, :saved => 'false'
330
+ saveable_cache.cached_weighted_score = 50
331
+ expect(saveable_cache.weighted_score).to eq(50)
332
+ end
333
+
334
+ it "should select from cached weighted average if there is a weighted average column" do
335
+ saveable_cache.save_by :saver => saver, :saved => 'false'
336
+ saveable_cache.cached_weighted_average = 50
337
+ expect(saveable_cache.weighted_average).to eq(50)
338
+ end
339
+
340
+ it "should update cached total saves_for when saving under an scope" do
341
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
342
+ expect(saveable_cache.cached_saves_total).to eq(1)
343
+ end
344
+
345
+ it "should update cached up saves_for when saving under an scope" do
346
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
347
+ expect(saveable_cache.cached_saves_up).to eq(1)
348
+ end
349
+
350
+ it "should update cached total saves_for when a scoped saved down is removed" do
351
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
352
+ saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
353
+ expect(saveable_cache.cached_saves_total).to eq(0)
354
+ end
355
+
356
+ it "should update cached up saves_for when a scoped saved down is removed" do
357
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => 'rank'
358
+ saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
359
+ expect(saveable_cache.cached_saves_up).to eq(0)
360
+ end
361
+
362
+ it "should update cached down saves_for when downsaving under a scope" do
363
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => 'rank'
364
+ expect(saveable_cache.cached_saves_down).to eq(1)
365
+ end
366
+
367
+ it "should update cached down saves_for when a scoped saved down is removed" do
368
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => 'rank'
369
+ saveable_cache.unsaved :saver => saver, :save_scope => 'rank'
370
+ expect(saveable_cache.cached_saves_down).to eq(0)
371
+ end
372
+
373
+ end
374
+
375
+ describe "with scoped cached saves_for" do
376
+
377
+ it "should update cached total saves_for if there is a total column" do
378
+ saveable_cache.cached_scoped_test_saves_total = 50
379
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
380
+ expect(saveable_cache.cached_scoped_test_saves_total).to eq(1)
381
+ end
382
+
383
+ it "should update cached total saves_for when a saved up is removed" do
384
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
385
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
386
+ expect(saveable_cache.cached_scoped_test_saves_total).to eq(0)
387
+ end
388
+
389
+ it "should update cached total saves_for when a saved down is removed" do
390
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
391
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
392
+ expect(saveable_cache.cached_scoped_test_saves_total).to eq(0)
393
+ end
394
+
395
+ it "should update cached score saves_for if there is a score column" do
396
+ saveable_cache.cached_scoped_test_saves_score = 50
397
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
398
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(1)
399
+ saveable_cache.save_by :saver => saver2, :saved => 'false', :save_scope => "test"
400
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
401
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
402
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(-2)
403
+ end
404
+
405
+ it "should update cached score saves_for when a saved up is removed" do
406
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
407
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(1)
408
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
409
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
410
+ end
411
+
412
+ it "should update cached score saves_for when a saved down is removed" do
413
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
414
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(-1)
415
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
416
+ expect(saveable_cache.cached_scoped_test_saves_score).to eq(0)
417
+ end
418
+
419
+ it "should update cached up saves_for if there is an up saved column" do
420
+ saveable_cache.cached_scoped_test_saves_up = 50
421
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
422
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
423
+ expect(saveable_cache.cached_scoped_test_saves_up).to eq(1)
424
+ end
425
+
426
+ it "should update cached down saves_for if there is a down saved column" do
427
+ saveable_cache.cached_scoped_test_saves_down = 50
428
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
429
+ expect(saveable_cache.cached_scoped_test_saves_down).to eq(1)
430
+ end
431
+
432
+ it "should update cached up saves_for when a saved up is removed" do
433
+ saveable_cache.save_by :saver => saver, :saved => 'true', :save_scope => "test"
434
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
435
+ expect(saveable_cache.cached_scoped_test_saves_up).to eq(0)
436
+ end
437
+
438
+ it "should update cached down saves_for when a saved down is removed" do
439
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
440
+ saveable_cache.unsaved :saver => saver, :save_scope => "test"
441
+ expect(saveable_cache.cached_scoped_test_saves_down).to eq(0)
442
+ end
443
+
444
+ it "should select from cached total saves_for if there a total column" do
445
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
446
+ saveable_cache.cached_scoped_test_saves_total = 50
447
+ expect(saveable_cache.count_saves_total(false, "test")).to eq(50)
448
+ end
449
+
450
+ it "should select from cached up saves_for if there is an up saved column" do
451
+ saveable_cache.save_by :saver => saver, :save_scope => "test"
452
+ saveable_cache.cached_scoped_test_saves_up = 50
453
+ expect(saveable_cache.count_saves_up(false, "test")).to eq(50)
454
+ end
455
+
456
+ it "should select from cached down saves_for if there is a down saved column" do
457
+ saveable_cache.save_by :saver => saver, :saved => 'false', :save_scope => "test"
458
+ saveable_cache.cached_scoped_test_saves_down = 50
459
+ expect(saveable_cache.count_saves_down(false, "test")).to eq(50)
460
+ end
461
+
462
+ end
463
+
464
+ describe "sti models" do
465
+
466
+ it "should be able to saved on a saveable child of a non saveable sti model" do
467
+ saveable = SaveableChildOfStiNotSaveable.create(:name => 'sti child')
468
+
469
+ saveable.save_by :saver => saver, :saved => 'yes'
470
+ expect(saveable.saves_for.size).to eq(1)
471
+ end
472
+
473
+ it "should not be able to saved on a parent non saveable" do
474
+ expect(StiNotSaveable).not_to be_saveable
475
+ end
476
+
477
+ it "should be able to saved on a child when its parent is saveable" do
478
+ saveable = ChildOfStiSaveable.create(:name => 'sti child')
479
+
480
+ saveable.save_by :saver => saver, :saved => 'yes'
481
+ expect(saveable.saves_for.size).to eq(1)
482
+ end
483
+ end
484
+ end