acts_as_saveable 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.travis.yml +25 -0
- data/Gemfile +17 -0
- data/README.markdown +399 -0
- data/Rakefile +10 -0
- data/acts_as_saveable.gemspec +24 -0
- data/lib/acts_as_saveable.rb +21 -0
- data/lib/acts_as_saveable/extenders/controller.rb +19 -0
- data/lib/acts_as_saveable/extenders/saveable.rb +25 -0
- data/lib/acts_as_saveable/extenders/saver.rb +24 -0
- data/lib/acts_as_saveable/helpers/words.rb +36 -0
- data/lib/acts_as_saveable/save.rb +28 -0
- data/lib/acts_as_saveable/saveable.rb +330 -0
- data/lib/acts_as_saveable/saver.rb +131 -0
- data/lib/acts_as_saveable/version.rb +3 -0
- data/lib/generators/acts_as_saveable/migration/migration_generator.rb +31 -0
- data/lib/generators/acts_as_saveable/migration/templates/active_record/migration.rb +27 -0
- data/spec/saveable_saver_spec.rb +21 -0
- data/spec/saveable_spec.rb +21 -0
- data/spec/saver_spec.rb +21 -0
- data/spec/shared_example/saveable_model_spec.rb +484 -0
- data/spec/shared_example/saver_model_spec.rb +275 -0
- data/spec/spec_helper.rb +132 -0
- data/spec/words_spec.rb +30 -0
- metadata +103 -0
@@ -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,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
|
data/spec/saver_spec.rb
ADDED
@@ -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
|