deferred_associations 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,236 +1,244 @@
1
- require "spec_helper"
2
- require 'has_and_belongs_to_many_with_deferred_save'
3
-
4
- describe "has_and_belongs_to_many_with_deferred_save" do
5
- describe "room maximum_occupancy" do
6
- before :all do
7
- @people = []
8
- @people << Person.create(:name => 'Filbert')
9
- @people << Person.create(:name => 'Miguel')
10
- @people << Person.create(:name => 'Rainer')
11
- @room = Room.new(:maximum_occupancy => 2)
12
- end
13
- after :all do
14
- Person.delete_all
15
- Room.delete_all
16
- end
17
-
18
- it "passes initial checks" do
19
- Room .count.should == 0
20
- Person.count.should == 3
21
-
22
- @room.people.should == []
23
- @room.people_without_deferred_save.should == []
24
- @room.people_without_deferred_save.object_id.should_not ==
25
- @room.unsaved_people.object_id
26
- end
27
-
28
- it "after adding people to room, it should not have saved anything to the database" do
29
- @room.people << @people[0]
30
- @room.people << @people[1]
31
-
32
- # Still not saved to the association table!
33
- Room.count_by_sql("select count(*) from people_rooms").should == 0
34
- @room.people_without_deferred_save.size. should == 0
35
- end
36
-
37
- it "but room.people.size should still report the current size of 2" do
38
- @room.people.size.should == 2 # 2 because this looks at unsaved_people and not at the database
39
- end
40
-
41
- it "after saving the model, the association should be saved in the join table" do
42
- @room.save # Only here is it actually saved to the association table!
43
- @room.errors.full_messages.should == []
44
- Room.count_by_sql("select count(*) from people_rooms").should == 2
45
- @room.people.size. should == 2
46
- @room.people_without_deferred_save.size. should == 2
47
- end
48
-
49
- it "when we try to add a 3rd person, it should add a validation error to the errors object like any other validation error" do
50
- lambda { @room.people << @people[2] }.should_not raise_error
51
- @room.people.size. should == 3
52
-
53
- Room.count_by_sql("select count(*) from people_rooms").should == 2
54
- @room.valid?
55
- @room.get_error(:people).should == "This room has reached its maximum occupancy"
56
- @room.people.size. should == 3 # Just like with normal attributes that fail validation... the attribute still contains the invalid data but we refuse to save until it is changed to something that is *valid*.
57
- end
58
-
59
- it "when we try to save, it should fail, because room.people is still invalid" do
60
- @room.save.should == false
61
- Room.count_by_sql("select count(*) from people_rooms").should == 2 # It's still not there, because it didn't pass the validation.
62
- @room.get_error(:people).should == "This room has reached its maximum occupancy"
63
- @room.people.size. should == 3
64
- @people.map {|p| p.reload; p.rooms.size}.should == [1, 1, 0]
65
- end
66
-
67
- it "when we reload, it should go back to only having 2 people in the room" do
68
- @room.reload
69
- @room.people.size. should == 2
70
- @room.people_without_deferred_save.size. should == 2
71
- @people.map {|p| p.reload; p.rooms.size}. should == [1, 1, 0]
72
- end
73
-
74
- it "if they try to go around our accessors and use the original accessors, then (and only then) will the exception be raised in before_adding_person..." do
75
- lambda do
76
- @room.people_without_deferred_save << @people[2]
77
- end.should raise_error(RuntimeError)
78
- end
79
-
80
- it "lets you bypass the validation on Room if we add the association from the other side (person.rooms <<)?" do
81
- @people[2].rooms << @room
82
- @people[2].rooms.size.should == 1
83
-
84
- # Adding it from one direction does not add it to the other object's association (@room.people), so the validation passes.
85
- @room.reload.people.size.should == 2
86
- @people[2].valid?
87
- @people[2].errors.full_messages.should == []
88
- @people[2].save.should == true
89
-
90
- # It is only after reloading that @room.people has this 3rd object, causing it to be invalid, and by then it's too late to do anything about it.
91
- @room.reload.people.size.should == 3
92
- @room.valid?.should == false
93
- end
94
-
95
- it "only if you add the validation to both sides, can you ensure that the size of the association does not exceed some limit" do
96
- @room.reload.people.size.should == 3
97
- @room.people.delete(@people[2])
98
- @room.save.should == true
99
- @room.reload.people.size.should == 2
100
- @people[2].reload.rooms.size.should == 0
101
-
102
- obj = @people[2]
103
- obj.do_extra_validation = true
104
-
105
- @people[2].rooms << @room
106
- @people[2].rooms.size.should == 1
107
-
108
- @room.reload.people.size.should == 2
109
- @people[2].valid?.should be_false
110
- @people[2].get_error(:rooms).should == "This room has reached its maximum occupancy"
111
- @room.reload.people.size.should == 2
112
- end
113
-
114
- it "still lets you do find" do
115
- if ar4?
116
- @room.people2.where(:name => 'Filbert').first.should == @people[0]
117
- @room.people_without_deferred_save.where(:name => 'Filbert').first.should == @people[0]
118
- @room.people.where(:name => 'Filbert').first.should == @people[0]
119
- else
120
- @room.people2. find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
121
- @room.people_without_deferred_save.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
122
- @room.people2.first(:conditions => {:name => 'Filbert'}).should == @people[0]
123
- @room.people_without_deferred_save.first(:conditions => {:name => 'Filbert'}).should == @people[0]
124
-
125
- @room.people.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
126
- @room.people.first(:conditions => {:name => 'Filbert'}). should == @people[0]
127
- @room.people.last(:conditions => {:name => 'Filbert'}). should == @people[0]
128
- end
129
-
130
- @room.people.first. should == @people[0]
131
- @room.people.last. should == @people[1] # @people[2] was removed before
132
- @room.people.find_by_name('Filbert'). should == @people[0]
133
- @room.people_without_deferred_save.find_by_name('Filbert').should == @people[0]
134
- end
135
-
136
- it "should be dumpable with Marshal" do
137
- lambda { Marshal.dump(@room.people) }.should_not raise_exception
138
- lambda { Marshal.dump(Room.new.people) }.should_not raise_exception
139
- end
140
-
141
- it "should detect difference in association" do
142
- @room = Room.find(@room.id)
143
- @room.bs_diff_before_module.should be_nil
144
- @room.bs_diff_after_module.should be_nil
145
- @room.bs_diff_method.should be_nil
146
-
147
- @room.people.size.should == 2
148
- @room.people = [@room.people[0]]
149
- @room.save.should be_true
150
-
151
- @room.bs_diff_before_module.should be_true
152
- @room.bs_diff_after_module.should be_true
153
- if ar2?
154
- @room.bs_diff_method.should be_true
155
- else
156
- @room.bs_diff_method.should be_nil # Rails 3.2: nil (before_save filter is not supported)
157
- end
158
- end
159
-
160
- it "should act like original habtm when using ID array with array manipulation" do
161
- @room = Room.find(@room.id)
162
- @room.people = [@people[0]]
163
- @room.save
164
- @room = Room.find(@room.id) # we don't want to let id and object setters interfere with each other
165
- @room.people2_ids << @people[1].id
166
- @room.people2_ids.should == [@people[0].id] # ID array manipulation is ignored
167
-
168
- @room.person_ids.size.should == 1
169
- @room.person_ids << @people[1].id
170
- @room.person_ids.should == [@people[0].id]
171
- Room.find(@room.id).person_ids.should == [@people[0].id]
172
- @room.save.should be_true
173
- Room.find(@room.id).person_ids.should == [@people[0].id] # ID array manipulation is ignored, too
174
- end
175
-
176
- it "should work with id setters" do
177
- @room = Room.find(@room.id)
178
- @room.people = [@people[0], @people[1]]
179
- @room.save
180
- @room = Room.find(@room.id)
181
- @room.person_ids.should == [@people[0].id, @people[1].id]
182
- @room.person_ids = [@people[1].id]
183
- @room.person_ids.should == [@people[1].id]
184
- Room.find(@room.id).person_ids.should == [@people[0].id,@people[1].id]
185
- @room.save.should be_true
186
- Room.find(@room.id).person_ids.should == [@people[1].id]
187
- end
188
-
189
- it "should work with multiple id setters and object setters" do
190
- @room = Room.find(@room.id)
191
- @room.people = [@people[0]]
192
- @room.person_ids = [@people[0].id, @people[1].id]
193
- @room.people = [@people[1]]
194
- @room.person_ids = [@people[0].id, @people[1].id]
195
- @room.people = [@people[1]]
196
- @room.save
197
- @room = Room.find(@room.id)
198
- @room.people.should == [@people[1]]
199
- end
200
-
201
- it "should give klass in AR 3/4" do
202
- unless ar2?
203
- @room.people.klass.should == Person
204
- end
205
- end
206
-
207
- it "should give aliased_table_name in AR 2.3" do
208
- if ar2?
209
- @room.people.aliased_table_name.should == "people"
210
- end
211
- end
212
- end
213
-
214
- describe "doors" do
215
- before :all do
216
- @rooms = []
217
- @rooms << Room.create(:name => 'Kitchen', :maximum_occupancy => 1)
218
- @rooms << Room.create(:name => 'Dining room', :maximum_occupancy => 10)
219
- @door = Door.new(:name => 'Kitchen-Dining-room door')
220
- end
221
-
222
- it "passes initial checks" do
223
- Room.count.should == 2
224
- Door.count.should == 0
225
-
226
- @door.rooms.should == []
227
- @door.rooms_without_deferred_save.should == []
228
- end
229
-
230
- it "the association has an include? method" do
231
- @door.rooms << @rooms[0]
232
- @door.rooms.include?(@rooms[0]).should be_true
233
- @door.rooms.include?(@rooms[1]).should be_false
234
- end
235
- end
236
- end
1
+ require "spec_helper"
2
+ require 'has_and_belongs_to_many_with_deferred_save'
3
+
4
+ describe "has_and_belongs_to_many_with_deferred_save" do
5
+ describe "room maximum_occupancy" do
6
+ before :all do
7
+ @people = []
8
+ @people << Person.create(:name => 'Filbert')
9
+ @people << Person.create(:name => 'Miguel')
10
+ @people << Person.create(:name => 'Rainer')
11
+ @room = Room.new(:maximum_occupancy => 2)
12
+ end
13
+ after :all do
14
+ Person.delete_all
15
+ Room.delete_all
16
+ end
17
+
18
+ it "passes initial checks" do
19
+ Room .count.should == 0
20
+ Person.count.should == 3
21
+
22
+ @room.people.should == []
23
+ @room.people_without_deferred_save.should == []
24
+ @room.people_without_deferred_save.object_id.should_not ==
25
+ @room.unsaved_people.object_id
26
+ end
27
+
28
+ it "after adding people to room, it should not have saved anything to the database" do
29
+ @room.people << @people[0]
30
+ @room.people << @people[1]
31
+
32
+ # Still not saved to the association table!
33
+ Room.count_by_sql("select count(*) from people_rooms").should == 0
34
+ @room.people_without_deferred_save.size. should == 0
35
+ end
36
+
37
+ it "but room.people.size should still report the current size of 2" do
38
+ @room.people.size.should == 2 # 2 because this looks at unsaved_people and not at the database
39
+ end
40
+
41
+ it "after saving the model, the association should be saved in the join table" do
42
+ @room.save # Only here is it actually saved to the association table!
43
+ @room.errors.full_messages.should == []
44
+ Room.count_by_sql("select count(*) from people_rooms").should == 2
45
+ @room.people.size. should == 2
46
+ @room.people_without_deferred_save.size. should == 2
47
+ end
48
+
49
+ it "when we try to add a 3rd person, it should add a validation error to the errors object like any other validation error" do
50
+ lambda { @room.people << @people[2] }.should_not raise_error
51
+ @room.people.size. should == 3
52
+
53
+ Room.count_by_sql("select count(*) from people_rooms").should == 2
54
+ @room.valid?
55
+ @room.get_error(:people).should == "This room has reached its maximum occupancy"
56
+ @room.people.size. should == 3 # Just like with normal attributes that fail validation... the attribute still contains the invalid data but we refuse to save until it is changed to something that is *valid*.
57
+ end
58
+
59
+ it "when we try to save, it should fail, because room.people is still invalid" do
60
+ @room.save.should == false
61
+ Room.count_by_sql("select count(*) from people_rooms").should == 2 # It's still not there, because it didn't pass the validation.
62
+ @room.get_error(:people).should == "This room has reached its maximum occupancy"
63
+ @room.people.size. should == 3
64
+ @people.map {|p| p.reload; p.rooms.size}.should == [1, 1, 0]
65
+ end
66
+
67
+ it "when we reload, it should go back to only having 2 people in the room" do
68
+ @room.reload
69
+ @room.people.size. should == 2
70
+ @room.people_without_deferred_save.size. should == 2
71
+ @people.map {|p| p.reload; p.rooms.size}. should == [1, 1, 0]
72
+ end
73
+
74
+ it "if they try to go around our accessors and use the original accessors, then (and only then) will the exception be raised in before_adding_person..." do
75
+ lambda do
76
+ @room.people_without_deferred_save << @people[2]
77
+ end.should raise_error(RuntimeError)
78
+ end
79
+
80
+ it "lets you bypass the validation on Room if we add the association from the other side (person.rooms <<)?" do
81
+ @people[2].rooms << @room
82
+ @people[2].rooms.size.should == 1
83
+
84
+ # Adding it from one direction does not add it to the other object's association (@room.people), so the validation passes.
85
+ @room.reload.people.size.should == 2
86
+ @people[2].valid?
87
+ @people[2].errors.full_messages.should == []
88
+ @people[2].save.should == true
89
+
90
+ # It is only after reloading that @room.people has this 3rd object, causing it to be invalid, and by then it's too late to do anything about it.
91
+ @room.reload.people.size.should == 3
92
+ @room.valid?.should == false
93
+ end
94
+
95
+ it "only if you add the validation to both sides, can you ensure that the size of the association does not exceed some limit" do
96
+ @room.reload.people.size.should == 3
97
+ @room.people.delete(@people[2])
98
+ @room.save.should == true
99
+ @room.reload.people.size.should == 2
100
+ @people[2].reload.rooms.size.should == 0
101
+
102
+ obj = @people[2]
103
+ obj.do_extra_validation = true
104
+
105
+ @people[2].rooms << @room
106
+ @people[2].rooms.size.should == 1
107
+
108
+ @room.reload.people.size.should == 2
109
+ @people[2].valid?.should be_false
110
+ @people[2].get_error(:rooms).should == "This room has reached its maximum occupancy"
111
+ @room.reload.people.size.should == 2
112
+ end
113
+
114
+ it "still lets you do find" do
115
+ if ar4?
116
+ @room.people2.where(:name => 'Filbert').first.should == @people[0]
117
+ @room.people_without_deferred_save.where(:name => 'Filbert').first.should == @people[0]
118
+ @room.people.where(:name => 'Filbert').first.should == @people[0]
119
+ else
120
+ @room.people2. find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
121
+ @room.people_without_deferred_save.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
122
+ @room.people2.first(:conditions => {:name => 'Filbert'}).should == @people[0]
123
+ @room.people_without_deferred_save.first(:conditions => {:name => 'Filbert'}).should == @people[0]
124
+
125
+ @room.people.find(:first, :conditions => {:name => 'Filbert'}).should == @people[0]
126
+ @room.people.first(:conditions => {:name => 'Filbert'}). should == @people[0]
127
+ @room.people.last(:conditions => {:name => 'Filbert'}). should == @people[0]
128
+ end
129
+
130
+ @room.people.first. should == @people[0]
131
+ @room.people.last. should == @people[1] # @people[2] was removed before
132
+ @room.people.find_by_name('Filbert'). should == @people[0]
133
+ @room.people_without_deferred_save.find_by_name('Filbert').should == @people[0]
134
+ end
135
+
136
+ it "should be dumpable with Marshal" do
137
+ lambda { Marshal.dump(@room.people) }.should_not raise_exception
138
+ lambda { Marshal.dump(Room.new.people) }.should_not raise_exception
139
+ end
140
+
141
+ it "should detect difference in association" do
142
+ @room = Room.find(@room.id)
143
+ @room.bs_diff_before_module.should be_nil
144
+ @room.bs_diff_after_module.should be_nil
145
+ @room.bs_diff_method.should be_nil
146
+
147
+ @room.people.size.should == 2
148
+ @room.people = [@room.people[0]]
149
+ @room.save.should be_true
150
+
151
+ @room.bs_diff_before_module.should be_true
152
+ @room.bs_diff_after_module.should be_true
153
+ if ar2?
154
+ @room.bs_diff_method.should be_true
155
+ else
156
+ @room.bs_diff_method.should be_nil # Rails 3.2: nil (before_save filter is not supported)
157
+ end
158
+ end
159
+
160
+ it "should act like original habtm when using ID array with array manipulation" do
161
+ @room = Room.find(@room.id)
162
+ @room.people = [@people[0]]
163
+ @room.save
164
+ @room = Room.find(@room.id) # we don't want to let id and object setters interfere with each other
165
+ @room.people2_ids << @people[1].id
166
+ @room.people2_ids.should == [@people[0].id] # ID array manipulation is ignored
167
+
168
+ @room.person_ids.size.should == 1
169
+ @room.person_ids << @people[1].id
170
+ @room.person_ids.should == [@people[0].id]
171
+ Room.find(@room.id).person_ids.should == [@people[0].id]
172
+ @room.save.should be_true
173
+ Room.find(@room.id).person_ids.should == [@people[0].id] # ID array manipulation is ignored, too
174
+ end
175
+
176
+ it "should work with id setters" do
177
+ @room = Room.find(@room.id)
178
+ @room.people = [@people[0], @people[1]]
179
+ @room.save
180
+ @room = Room.find(@room.id)
181
+ @room.person_ids.should == [@people[0].id, @people[1].id]
182
+ @room.person_ids = [@people[1].id]
183
+ @room.person_ids.should == [@people[1].id]
184
+ Room.find(@room.id).person_ids.should == [@people[0].id,@people[1].id]
185
+ @room.save.should be_true
186
+ Room.find(@room.id).person_ids.should == [@people[1].id]
187
+ end
188
+
189
+ it "should work with multiple id setters and object setters" do
190
+ @room = Room.find(@room.id)
191
+ @room.people = [@people[0]]
192
+ @room.person_ids = [@people[0].id, @people[1].id]
193
+ @room.people = [@people[1]]
194
+ @room.person_ids = [@people[0].id, @people[1].id]
195
+ @room.people = [@people[1]]
196
+ @room.save
197
+ @room = Room.find(@room.id)
198
+ @room.people.should == [@people[1]]
199
+ end
200
+
201
+ it "should give klass in AR 3/4" do
202
+ unless ar2?
203
+ @room.people.klass.should == Person
204
+ end
205
+ end
206
+
207
+ it "should give aliased_table_name in AR 2.3" do
208
+ if ar2?
209
+ @room.people.aliased_table_name.should == "people"
210
+ end
211
+ end
212
+
213
+ it "should support reload both with and without params" do
214
+ # find options are deprecated with AR 4, but reload still
215
+ # supports them
216
+ @room.reload.id.should == @room.id
217
+ with_param = @room.reload(:select => 'id')
218
+ with_param.id.should == @room.id
219
+ end
220
+ end
221
+
222
+ describe "doors" do
223
+ before :all do
224
+ @rooms = []
225
+ @rooms << Room.create(:name => 'Kitchen', :maximum_occupancy => 1)
226
+ @rooms << Room.create(:name => 'Dining room', :maximum_occupancy => 10)
227
+ @door = Door.new(:name => 'Kitchen-Dining-room door')
228
+ end
229
+
230
+ it "passes initial checks" do
231
+ Room.count.should == 2
232
+ Door.count.should == 0
233
+
234
+ @door.rooms.should == []
235
+ @door.rooms_without_deferred_save.should == []
236
+ end
237
+
238
+ it "the association has an include? method" do
239
+ @door.rooms << @rooms[0]
240
+ @door.rooms.include?(@rooms[0]).should be_true
241
+ @door.rooms.include?(@rooms[1]).should be_false
242
+ end
243
+ end
244
+ end
data/spec/models/door.rb CHANGED
@@ -1,3 +1,3 @@
1
- class Door < ActiveRecord::Base
2
- has_and_belongs_to_many_with_deferred_save :rooms
3
- end
1
+ class Door < ActiveRecord::Base
2
+ has_and_belongs_to_many_with_deferred_save :rooms
3
+ end
@@ -1,15 +1,15 @@
1
- class Person < ActiveRecord::Base
2
- has_and_belongs_to_many_with_deferred_save :rooms, :validate => true
3
-
4
- attr_accessor :do_extra_validation
5
- validate :extra_validation, :if => :do_extra_validation
6
-
7
- def extra_validation
8
- rooms.each do |room|
9
- this_room_unsaved = rooms_without_deferred_save.include?(room) ? 0 : 1
10
- if room.people.size + this_room_unsaved > room.maximum_occupancy
11
- errors.add :rooms, "This room has reached its maximum occupancy"
12
- end
13
- end
14
- end
15
- end
1
+ class Person < ActiveRecord::Base
2
+ has_and_belongs_to_many_with_deferred_save :rooms, :validate => true
3
+
4
+ attr_accessor :do_extra_validation
5
+ validate :extra_validation, :if => :do_extra_validation
6
+
7
+ def extra_validation
8
+ rooms.each do |room|
9
+ this_room_unsaved = rooms_without_deferred_save.include?(room) ? 0 : 1
10
+ if room.people.size + this_room_unsaved > room.maximum_occupancy
11
+ errors.add :rooms, "This room has reached its maximum occupancy"
12
+ end
13
+ end
14
+ end
15
+ end
data/spec/models/room.rb CHANGED
@@ -1,51 +1,51 @@
1
- class Room < ActiveRecord::Base
2
-
3
- attr_accessor :bs_diff_before_module
4
- attr_accessor :bs_diff_after_module
5
- attr_accessor :bs_diff_method
6
-
7
- before_save :diff_before_module
8
-
9
- has_and_belongs_to_many_with_deferred_save :people, :before_add => :before_adding_person
10
- has_and_belongs_to_many :people2, :class_name => 'Person'
11
- has_and_belongs_to_many_with_deferred_save :doors
12
-
13
- has_many_with_deferred_save :tables
14
- has_many_with_deferred_save :chairs, :through => :tables #TODO test compatibility with through associations
15
-
16
- before_save :diff_after_module
17
-
18
- validate :people_count
19
-
20
- def people_count
21
- if people.size > maximum_occupancy
22
- errors.add :people, "This room has reached its maximum occupancy"
23
- end
24
- end
25
-
26
- # Just in case they try to bypass our new accessor and call people_without_deferred_save directly...
27
- # (This should never be necessary; it is for demonstration purposes only...)
28
- def before_adding_person(person)
29
- if self.people_without_deferred_save.size + [person].size > maximum_occupancy
30
- raise "There are too many people in this room"
31
- end
32
- end
33
-
34
- def diff_before_module
35
- #should detect the changes
36
- self.bs_diff_before_module = (people.size - people_without_deferred_save.size) != 0
37
- true
38
- end
39
-
40
- def diff_after_module
41
- # should not detect the changes
42
- self.bs_diff_after_module = (people.size - people_without_deferred_save.size) != 0
43
- true
44
- end
45
-
46
- def before_save
47
- # old_style, should not detect the changes
48
- self.bs_diff_method = (people.size - people_without_deferred_save.size) != 0
49
- true
50
- end
51
- end
1
+ class Room < ActiveRecord::Base
2
+
3
+ attr_accessor :bs_diff_before_module
4
+ attr_accessor :bs_diff_after_module
5
+ attr_accessor :bs_diff_method
6
+
7
+ before_save :diff_before_module
8
+
9
+ has_and_belongs_to_many_with_deferred_save :people, :before_add => :before_adding_person
10
+ has_and_belongs_to_many :people2, :class_name => 'Person'
11
+ has_and_belongs_to_many_with_deferred_save :doors
12
+
13
+ has_many_with_deferred_save :tables
14
+ has_many_with_deferred_save :chairs, :through => :tables #TODO test compatibility with through associations
15
+
16
+ before_save :diff_after_module
17
+
18
+ validate :people_count
19
+
20
+ def people_count
21
+ if people.size > maximum_occupancy
22
+ errors.add :people, "This room has reached its maximum occupancy"
23
+ end
24
+ end
25
+
26
+ # Just in case they try to bypass our new accessor and call people_without_deferred_save directly...
27
+ # (This should never be necessary; it is for demonstration purposes only...)
28
+ def before_adding_person(person)
29
+ if self.people_without_deferred_save.size + [person].size > maximum_occupancy
30
+ raise "There are too many people in this room"
31
+ end
32
+ end
33
+
34
+ def diff_before_module
35
+ #should detect the changes
36
+ self.bs_diff_before_module = (people.size - people_without_deferred_save.size) != 0
37
+ true
38
+ end
39
+
40
+ def diff_after_module
41
+ # should not detect the changes
42
+ self.bs_diff_after_module = (people.size - people_without_deferred_save.size) != 0
43
+ true
44
+ end
45
+
46
+ def before_save
47
+ # old_style, should not detect the changes
48
+ self.bs_diff_method = (people.size - people_without_deferred_save.size) != 0
49
+ true
50
+ end
51
+ end