acts_as_list 0.2.0 → 0.3.0
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.
- checksums.yaml +15 -0
- data/.travis.yml +9 -1
- data/gemfiles/rails3/Gemfile +8 -0
- data/gemfiles/rails4/Gemfile +8 -0
- data/lib/acts_as_list/active_record/acts/list.rb +60 -27
- data/lib/acts_as_list/version.rb +1 -1
- data/test/shared.rb +1 -0
- data/test/shared_array_scope_list.rb +62 -62
- data/test/shared_list.rb +96 -76
- data/test/shared_list_sub.rb +35 -35
- data/test/shared_no_addition.rb +25 -0
- data/test/shared_top_addition.rb +29 -29
- data/test/shared_zero_based.rb +23 -23
- data/test/test_list.rb +143 -111
- metadata +77 -94
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NzM4YWNhZmE0NzViMmFhNDI0OGM0ZDFkM2RkYzAxMDIxODY2M2E2Mg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MWYwZDU4MzgwNzhjMGQwYmU2YTJmOGZlZTUwODViOTc4NjBmZTlkYQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzFmMjljMTNmMjY1ZGU5YTJjMzgzYjc2NjQ1ZjMyOWYyOWUwMmExMmJjMGQ5
|
10
|
+
OGEwYjlhNjQ4YTdiM2RlZmQ3M2IxMzA1N2E3Y2I1MjE0NDE0OWZhNWU1Y2I5
|
11
|
+
NzI1ZjgwZWNiOTE1MGNiZDE5NDBmNDZkNDA3ZjdlMGZjMThmYmM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YTk3YjgxYThlYzE3MmQxY2QzNGNiN2QyNGZkYjY1ZGVmNzVkM2ZkM2QyNGI4
|
14
|
+
MjI5OTUzZTNhNjY2Nzk1ZWMxYmI4NmZlNTFiMjgyMTI1MWY5ZTk1NzBlYTMz
|
15
|
+
YzljYmY3MzMyZTUxZDk3M2QzNTEyNDJjNmVhODE1YzM0MTNlNTM=
|
data/.travis.yml
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 1.8.7
|
4
3
|
- 1.9.2
|
5
4
|
- 1.9.3
|
6
5
|
- 2.0.0
|
6
|
+
gemfile:
|
7
|
+
- gemfiles/rails3/Gemfile
|
8
|
+
- gemfiles/rails4/Gemfile
|
9
|
+
matrix:
|
10
|
+
allow_failures:
|
11
|
+
- rvm: 1.8.7
|
12
|
+
gemfile: gemfiles/rails4/Gemfile
|
13
|
+
- rvm: 1.9.2
|
14
|
+
gemfile: gemfiles/rails4/Gemfile
|
@@ -12,12 +12,12 @@ module ActiveRecord
|
|
12
12
|
# Todo list example:
|
13
13
|
#
|
14
14
|
# class TodoList < ActiveRecord::Base
|
15
|
-
# has_many :todo_items, :
|
15
|
+
# has_many :todo_items, order: "position"
|
16
16
|
# end
|
17
17
|
#
|
18
18
|
# class TodoItem < ActiveRecord::Base
|
19
19
|
# belongs_to :todo_list
|
20
|
-
# acts_as_list :
|
20
|
+
# acts_as_list scope: :todo_list
|
21
21
|
# end
|
22
22
|
#
|
23
23
|
# todo_list.first.move_to_bottom
|
@@ -29,33 +29,51 @@ module ActiveRecord
|
|
29
29
|
# * +scope+ - restricts what is to be considered a list. Given a symbol, it'll attach <tt>_id</tt>
|
30
30
|
# (if it hasn't already been added) and use that as the foreign key restriction. It's also possible
|
31
31
|
# to give it an entire string that is interpolated if you need a tighter scope than just a foreign key.
|
32
|
-
# Example: <tt>acts_as_list :
|
32
|
+
# Example: <tt>acts_as_list scope: 'todo_list_id = #{todo_list_id} AND completed = 0'</tt>
|
33
33
|
# * +top_of_list+ - defines the integer used for the top of the list. Defaults to 1. Use 0 to make the collection
|
34
34
|
# act more like an array in its indexing.
|
35
35
|
# * +add_new_at+ - specifies whether objects get added to the :top or :bottom of the list. (default: +bottom+)
|
36
|
+
# `nil` will result in new items not being added to the list on create
|
36
37
|
def acts_as_list(options = {})
|
37
|
-
configuration = { :
|
38
|
+
configuration = { column: "position", scope: "1 = 1", top_of_list: 1, add_new_at: :bottom}
|
38
39
|
configuration.update(options) if options.is_a?(Hash)
|
39
40
|
|
40
41
|
configuration[:scope] = "#{configuration[:scope]}_id".intern if configuration[:scope].is_a?(Symbol) && configuration[:scope].to_s !~ /_id$/
|
41
42
|
|
42
43
|
if configuration[:scope].is_a?(Symbol)
|
43
|
-
|
44
|
+
scope_methods = %(
|
44
45
|
def scope_condition
|
45
46
|
self.class.send(:sanitize_sql_hash_for_conditions, { :#{configuration[:scope].to_s} => send(:#{configuration[:scope].to_s}) })
|
46
47
|
end
|
48
|
+
|
49
|
+
def scope_changed?
|
50
|
+
changes.include?(scope_name.to_s)
|
51
|
+
end
|
47
52
|
)
|
48
53
|
elsif configuration[:scope].is_a?(Array)
|
49
|
-
|
50
|
-
def
|
51
|
-
|
54
|
+
scope_methods = %(
|
55
|
+
def attrs
|
56
|
+
%w(#{configuration[:scope].join(" ")}).inject({}) do |memo,column|
|
52
57
|
memo[column.intern] = send(column.intern); memo
|
53
58
|
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def scope_changed?
|
62
|
+
(attrs.keys & changes.keys.map(&:to_sym)).any?
|
63
|
+
end
|
64
|
+
|
65
|
+
def scope_condition
|
54
66
|
self.class.send(:sanitize_sql_hash_for_conditions, attrs)
|
55
67
|
end
|
56
68
|
)
|
57
69
|
else
|
58
|
-
|
70
|
+
scope_methods = %(
|
71
|
+
def scope_condition
|
72
|
+
"#{configuration[:scope]}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def scope_changed?() false end
|
76
|
+
)
|
59
77
|
end
|
60
78
|
|
61
79
|
class_eval <<-EOV
|
@@ -81,7 +99,7 @@ module ActiveRecord
|
|
81
99
|
'#{configuration[:add_new_at]}'
|
82
100
|
end
|
83
101
|
|
84
|
-
#{
|
102
|
+
#{scope_methods}
|
85
103
|
|
86
104
|
# only add to attr_accessible
|
87
105
|
# if the class has some mass_assignment_protection
|
@@ -92,10 +110,16 @@ module ActiveRecord
|
|
92
110
|
|
93
111
|
before_destroy :reload_position
|
94
112
|
after_destroy :decrement_positions_on_lower_items
|
95
|
-
before_create :add_to_list_#{configuration[:add_new_at]}
|
96
|
-
after_update :update_positions
|
97
113
|
before_update :check_scope
|
114
|
+
after_update :update_positions
|
115
|
+
|
116
|
+
scope :in_list, lambda { where("#{table_name}.#{configuration[:column]} IS NOT NULL") }
|
98
117
|
EOV
|
118
|
+
|
119
|
+
if configuration[:add_new_at].present?
|
120
|
+
self.send(:before_create, "add_to_list_#{configuration[:add_new_at]}")
|
121
|
+
end
|
122
|
+
|
99
123
|
end
|
100
124
|
end
|
101
125
|
|
@@ -157,6 +181,12 @@ module ActiveRecord
|
|
157
181
|
end
|
158
182
|
end
|
159
183
|
|
184
|
+
# Move the item within scope
|
185
|
+
def move_within_scope(scope_id)
|
186
|
+
send("#{scope_name}=", scope_id)
|
187
|
+
save!
|
188
|
+
end
|
189
|
+
|
160
190
|
# Increase the position of this item without adjusting the rest of the list.
|
161
191
|
def increment_position
|
162
192
|
return unless in_list?
|
@@ -184,10 +214,9 @@ module ActiveRecord
|
|
184
214
|
# Return the next higher item in the list.
|
185
215
|
def higher_item
|
186
216
|
return nil unless in_list?
|
187
|
-
acts_as_list_class.unscoped.
|
188
|
-
"#{scope_condition} AND #{position_column} < #{(send(position_column).to_i).to_s}"
|
189
|
-
|
190
|
-
)
|
217
|
+
acts_as_list_class.unscoped.
|
218
|
+
where("#{scope_condition} AND #{position_column} < #{(send(position_column).to_i).to_s}").
|
219
|
+
order("#{acts_as_list_class.table_name}.#{position_column} DESC").first
|
191
220
|
end
|
192
221
|
|
193
222
|
# Return the next n higher items in the list
|
@@ -205,10 +234,9 @@ module ActiveRecord
|
|
205
234
|
# Return the next lower item in the list.
|
206
235
|
def lower_item
|
207
236
|
return nil unless in_list?
|
208
|
-
acts_as_list_class.unscoped.
|
209
|
-
"#{scope_condition} AND #{position_column} > #{(send(position_column).to_i).to_s}"
|
210
|
-
|
211
|
-
)
|
237
|
+
acts_as_list_class.unscoped.
|
238
|
+
where("#{scope_condition} AND #{position_column} > #{(send(position_column).to_i).to_s}").
|
239
|
+
order("#{acts_as_list_class.table_name}.#{position_column} ASC").first
|
212
240
|
end
|
213
241
|
|
214
242
|
# Return the next n lower items in the list
|
@@ -279,7 +307,7 @@ module ActiveRecord
|
|
279
307
|
def bottom_item(except = nil)
|
280
308
|
conditions = scope_condition
|
281
309
|
conditions = "#{conditions} AND #{self.class.primary_key} != #{except.id}" if except
|
282
|
-
acts_as_list_class.unscoped.where(conditions).order("#{acts_as_list_class.table_name}.#{position_column} DESC").first
|
310
|
+
acts_as_list_class.unscoped.in_list.where(conditions).order("#{acts_as_list_class.table_name}.#{position_column} DESC").first
|
283
311
|
end
|
284
312
|
|
285
313
|
# Forces item to assume the bottom position in the list.
|
@@ -390,17 +418,22 @@ module ActiveRecord
|
|
390
418
|
def update_positions
|
391
419
|
old_position = send("#{position_column}_was").to_i
|
392
420
|
new_position = send(position_column).to_i
|
421
|
+
|
393
422
|
return unless acts_as_list_class.unscoped.where("#{scope_condition} AND #{position_column} = #{new_position}").count > 1
|
394
423
|
shuffle_positions_on_intermediate_items old_position, new_position, id
|
395
424
|
end
|
396
425
|
|
426
|
+
# Temporarily swap changes attributes with current attributes
|
427
|
+
def swap_changed_attributes
|
428
|
+
@changed_attributes.each { |k, _| @changed_attributes[k], self[k] =
|
429
|
+
self[k], @changed_attributes[k] }
|
430
|
+
end
|
431
|
+
|
397
432
|
def check_scope
|
398
|
-
if
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
send("decrement_positions_on_lower_items")
|
403
|
-
self["#{scope_name}"] = new_scope_id
|
433
|
+
if scope_changed?
|
434
|
+
swap_changed_attributes
|
435
|
+
send('decrement_positions_on_lower_items') if lower_item
|
436
|
+
swap_changed_attributes
|
404
437
|
send("add_to_list_#{add_new_at}")
|
405
438
|
end
|
406
439
|
end
|
data/lib/acts_as_list/version.rb
CHANGED
data/test/shared.rb
CHANGED
@@ -1,87 +1,87 @@
|
|
1
1
|
module Shared
|
2
2
|
module ArrayScopeList
|
3
3
|
def setup
|
4
|
-
(1..4).each { |counter| ArrayScopeListMixin.create! :
|
5
|
-
(1..4).each { |counter| ArrayScopeListMixin.create! :
|
4
|
+
(1..4).each { |counter| ArrayScopeListMixin.create! pos: counter, parent_id: 5, parent_type: 'ParentClass' }
|
5
|
+
(1..4).each { |counter| ArrayScopeListMixin.create! pos: counter, parent_id: 6, parent_type: 'ParentClass' }
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_reordering
|
9
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
9
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
10
10
|
|
11
|
-
ArrayScopeListMixin.
|
12
|
-
assert_equal [1, 3, 2, 4], ArrayScopeListMixin.
|
11
|
+
ArrayScopeListMixin.where(id: 2).first.move_lower
|
12
|
+
assert_equal [1, 3, 2, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
13
13
|
|
14
|
-
ArrayScopeListMixin.
|
15
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
14
|
+
ArrayScopeListMixin.where(id: 2).first.move_higher
|
15
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
16
16
|
|
17
|
-
ArrayScopeListMixin.
|
18
|
-
assert_equal [2, 3, 4, 1], ArrayScopeListMixin.
|
17
|
+
ArrayScopeListMixin.where(id: 1).first.move_to_bottom
|
18
|
+
assert_equal [2, 3, 4, 1], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
19
19
|
|
20
|
-
ArrayScopeListMixin.
|
21
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
20
|
+
ArrayScopeListMixin.where(id: 1).first.move_to_top
|
21
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
22
22
|
|
23
|
-
ArrayScopeListMixin.
|
24
|
-
assert_equal [1, 3, 4, 2], ArrayScopeListMixin.
|
23
|
+
ArrayScopeListMixin.where(id: 2).first.move_to_bottom
|
24
|
+
assert_equal [1, 3, 4, 2], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
25
25
|
|
26
|
-
ArrayScopeListMixin.
|
27
|
-
assert_equal [4, 1, 3, 2], ArrayScopeListMixin.
|
26
|
+
ArrayScopeListMixin.where(id: 4).first.move_to_top
|
27
|
+
assert_equal [4, 1, 3, 2], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
28
28
|
|
29
|
-
ArrayScopeListMixin.
|
30
|
-
assert_equal [1, 3, 2, 4], ArrayScopeListMixin.
|
31
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
29
|
+
ArrayScopeListMixin.where(id: 4).first.insert_at(4)
|
30
|
+
assert_equal [1, 3, 2, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
31
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:pos)
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_move_to_bottom_with_next_to_last_item
|
35
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
36
|
-
ArrayScopeListMixin.
|
37
|
-
assert_equal [1, 2, 4, 3], ArrayScopeListMixin.
|
35
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
36
|
+
ArrayScopeListMixin.where(id: 3).first.move_to_bottom
|
37
|
+
assert_equal [1, 2, 4, 3], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_next_prev
|
41
|
-
assert_equal ArrayScopeListMixin.
|
42
|
-
assert_nil ArrayScopeListMixin.
|
43
|
-
assert_equal ArrayScopeListMixin.
|
44
|
-
assert_nil ArrayScopeListMixin.
|
41
|
+
assert_equal ArrayScopeListMixin.where(id: 2).first, ArrayScopeListMixin.where(id: 1).first.lower_item
|
42
|
+
assert_nil ArrayScopeListMixin.where(id: 1).first.higher_item
|
43
|
+
assert_equal ArrayScopeListMixin.where(id: 3).first, ArrayScopeListMixin.where(id: 4).first.higher_item
|
44
|
+
assert_nil ArrayScopeListMixin.where(id: 4).first.lower_item
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_injection
|
48
|
-
item = ArrayScopeListMixin.new(:
|
48
|
+
item = ArrayScopeListMixin.new(parent_id: 1, parent_type: 'ParentClass')
|
49
49
|
assert_equal "pos", item.position_column
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_insert
|
53
|
-
new = ArrayScopeListMixin.create(:
|
53
|
+
new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
54
54
|
assert_equal 1, new.pos
|
55
55
|
assert new.first?
|
56
56
|
assert new.last?
|
57
57
|
|
58
|
-
new = ArrayScopeListMixin.create(:
|
58
|
+
new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
59
59
|
assert_equal 2, new.pos
|
60
60
|
assert !new.first?
|
61
61
|
assert new.last?
|
62
62
|
|
63
|
-
new = ArrayScopeListMixin.create(:
|
63
|
+
new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
64
64
|
assert_equal 3, new.pos
|
65
65
|
assert !new.first?
|
66
66
|
assert new.last?
|
67
67
|
|
68
|
-
new = ArrayScopeListMixin.create(:
|
68
|
+
new = ArrayScopeListMixin.create(parent_id: 0, parent_type: 'ParentClass')
|
69
69
|
assert_equal 1, new.pos
|
70
70
|
assert new.first?
|
71
71
|
assert new.last?
|
72
72
|
end
|
73
73
|
|
74
74
|
def test_insert_at
|
75
|
-
new = ArrayScopeListMixin.create(:
|
75
|
+
new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
76
76
|
assert_equal 1, new.pos
|
77
77
|
|
78
|
-
new = ArrayScopeListMixin.create(:
|
78
|
+
new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
79
79
|
assert_equal 2, new.pos
|
80
80
|
|
81
|
-
new = ArrayScopeListMixin.create(:
|
81
|
+
new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
82
82
|
assert_equal 3, new.pos
|
83
83
|
|
84
|
-
new4 = ArrayScopeListMixin.create(:
|
84
|
+
new4 = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
85
85
|
assert_equal 4, new4.pos
|
86
86
|
|
87
87
|
new4.insert_at(3)
|
@@ -96,7 +96,7 @@ module Shared
|
|
96
96
|
new4.reload
|
97
97
|
assert_equal 4, new4.pos
|
98
98
|
|
99
|
-
new5 = ArrayScopeListMixin.create(:
|
99
|
+
new5 = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
|
100
100
|
assert_equal 5, new5.pos
|
101
101
|
|
102
102
|
new5.insert_at(1)
|
@@ -107,54 +107,54 @@ module Shared
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def test_delete_middle
|
110
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
110
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
111
111
|
|
112
|
-
ArrayScopeListMixin.
|
112
|
+
ArrayScopeListMixin.where(id: 2).first.destroy
|
113
113
|
|
114
|
-
assert_equal [1, 3, 4], ArrayScopeListMixin.
|
114
|
+
assert_equal [1, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
115
115
|
|
116
|
-
assert_equal 1, ArrayScopeListMixin.
|
117
|
-
assert_equal 2, ArrayScopeListMixin.
|
118
|
-
assert_equal 3, ArrayScopeListMixin.
|
116
|
+
assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
|
117
|
+
assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
|
118
|
+
assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
|
119
119
|
|
120
|
-
ArrayScopeListMixin.
|
120
|
+
ArrayScopeListMixin.where(id: 1).first.destroy
|
121
121
|
|
122
|
-
assert_equal [3, 4], ArrayScopeListMixin.
|
122
|
+
assert_equal [3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
123
123
|
|
124
|
-
assert_equal 1, ArrayScopeListMixin.
|
125
|
-
assert_equal 2, ArrayScopeListMixin.
|
124
|
+
assert_equal 1, ArrayScopeListMixin.where(id: 3).first.pos
|
125
|
+
assert_equal 2, ArrayScopeListMixin.where(id: 4).first.pos
|
126
126
|
end
|
127
127
|
|
128
128
|
def test_remove_from_list_should_then_fail_in_list?
|
129
|
-
assert_equal true, ArrayScopeListMixin.
|
130
|
-
ArrayScopeListMixin.
|
131
|
-
assert_equal false, ArrayScopeListMixin.
|
129
|
+
assert_equal true, ArrayScopeListMixin.where(id: 1).first.in_list?
|
130
|
+
ArrayScopeListMixin.where(id: 1).first.remove_from_list
|
131
|
+
assert_equal false, ArrayScopeListMixin.where(id: 1).first.in_list?
|
132
132
|
end
|
133
133
|
|
134
134
|
def test_remove_from_list_should_set_position_to_nil
|
135
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
135
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
136
136
|
|
137
|
-
ArrayScopeListMixin.
|
137
|
+
ArrayScopeListMixin.where(id: 2).first.remove_from_list
|
138
138
|
|
139
|
-
assert_equal [2, 1, 3, 4], ArrayScopeListMixin.
|
139
|
+
assert_equal [2, 1, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
140
140
|
|
141
|
-
assert_equal 1, ArrayScopeListMixin.
|
142
|
-
assert_equal nil, ArrayScopeListMixin.
|
143
|
-
assert_equal 2, ArrayScopeListMixin.
|
144
|
-
assert_equal 3, ArrayScopeListMixin.
|
141
|
+
assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
|
142
|
+
assert_equal nil, ArrayScopeListMixin.where(id: 2).first.pos
|
143
|
+
assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
|
144
|
+
assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
|
145
145
|
end
|
146
146
|
|
147
147
|
def test_remove_before_destroy_does_not_shift_lower_items_twice
|
148
|
-
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.
|
148
|
+
assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
149
149
|
|
150
|
-
ArrayScopeListMixin.
|
151
|
-
ArrayScopeListMixin.
|
150
|
+
ArrayScopeListMixin.where(id: 2).first.remove_from_list
|
151
|
+
ArrayScopeListMixin.where(id: 2).first.destroy
|
152
152
|
|
153
|
-
assert_equal [1, 3, 4], ArrayScopeListMixin.
|
153
|
+
assert_equal [1, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
|
154
154
|
|
155
|
-
assert_equal 1, ArrayScopeListMixin.
|
156
|
-
assert_equal 2, ArrayScopeListMixin.
|
157
|
-
assert_equal 3, ArrayScopeListMixin.
|
155
|
+
assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
|
156
|
+
assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
|
157
|
+
assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|