ranked-model 0.4.4 → 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/.travis.yml +32 -25
- data/Appraisals +40 -35
- data/Gemfile +12 -0
- data/Readme.mkd +61 -12
- data/gemfiles/rails_4_2.gemfile +8 -7
- data/gemfiles/rails_5_0.gemfile +8 -8
- data/gemfiles/rails_5_1.gemfile +8 -8
- data/gemfiles/rails_5_2.gemfile +7 -4
- data/gemfiles/rails_6_0.gemfile +22 -0
- data/gemfiles/rails_6_1.gemfile +22 -0
- data/lib/ranked-model/ranker.rb +356 -351
- data/lib/ranked-model/version.rb +1 -1
- data/lib/ranked-model.rb +1 -1
- data/ranked-model.gemspec +4 -4
- data/spec/duck-model/column_default_ducks_spec.rb +1 -1
- data/spec/duck-model/duck_spec.rb +84 -46
- data/spec/duck-model/lots_of_ducks_spec.rb +29 -33
- data/spec/ego-model/ego_spec.rb +3 -3
- data/spec/number-model/number_spec.rb +10 -2
- data/spec/player-model/records_already_exist_spec.rb +1 -1
- data/spec/ranked-model/ranker_spec.rb +18 -0
- data/spec/sti-model/element_spec.rb +24 -24
- data/spec/sti-model/vehicle_spec.rb +4 -4
- data/spec/support/active_record.rb +7 -5
- metadata +16 -16
- data/gemfiles/rails_4_1.gemfile +0 -22
data/lib/ranked-model/version.rb
CHANGED
data/lib/ranked-model.rb
CHANGED
data/ranked-model.gemspec
CHANGED
@@ -9,16 +9,16 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ["Matthew Beale"]
|
10
10
|
s.email = ["matt.beale@madhatted.com"]
|
11
11
|
s.homepage = "https://github.com/mixonic/ranked-model"
|
12
|
-
s.summary = %q{An acts_as_sortable replacement built for Rails
|
13
|
-
s.description = %q{ranked-model is a modern row sorting library built for Rails
|
12
|
+
s.summary = %q{An acts_as_sortable replacement built for Rails 4.2+}
|
13
|
+
s.description = %q{ranked-model is a modern row sorting library built for Rails 4.2+. It uses ARel aggressively and is better optimized than most other libraries.}
|
14
14
|
s.license = 'MIT'
|
15
15
|
|
16
|
-
s.add_dependency "activerecord", ">= 4.
|
16
|
+
s.add_dependency "activerecord", ">= 4.2"
|
17
17
|
s.add_development_dependency "rspec", "~> 3"
|
18
18
|
s.add_development_dependency "rspec-its"
|
19
19
|
s.add_development_dependency "mocha"
|
20
20
|
s.add_development_dependency "database_cleaner", "~> 1.7.0"
|
21
|
-
s.add_development_dependency "rake", "
|
21
|
+
s.add_development_dependency "rake", ">= 12.3.3"
|
22
22
|
s.add_development_dependency "appraisal"
|
23
23
|
s.add_development_dependency "pry"
|
24
24
|
|
@@ -48,9 +48,9 @@ describe Duck do
|
|
48
48
|
}
|
49
49
|
@ducks.each { |name, duck|
|
50
50
|
duck.reload
|
51
|
-
duck.
|
52
|
-
duck.
|
53
|
-
duck.
|
51
|
+
duck.update :row_position => 0
|
52
|
+
duck.update :size_position => 0
|
53
|
+
duck.update :age_position => 0
|
54
54
|
duck.save!
|
55
55
|
}
|
56
56
|
@ducks.each {|name, duck| duck.reload }
|
@@ -59,8 +59,8 @@ describe Duck do
|
|
59
59
|
describe "sorting by size on in_shin_pond" do
|
60
60
|
|
61
61
|
before {
|
62
|
-
@ducks[:quacky].
|
63
|
-
@ducks[:wingy].
|
62
|
+
@ducks[:quacky].update :size_position => 0
|
63
|
+
@ducks[:wingy].update :size_position => 2
|
64
64
|
}
|
65
65
|
|
66
66
|
subject { Duck.in_shin_pond.rank(:size).to_a }
|
@@ -76,8 +76,8 @@ describe Duck do
|
|
76
76
|
describe "sorting by age on Shin pond" do
|
77
77
|
|
78
78
|
before {
|
79
|
-
@ducks[:feathers].
|
80
|
-
@ducks[:wingy].
|
79
|
+
@ducks[:feathers].update :age_position => 0
|
80
|
+
@ducks[:wingy].update :age_position => 0
|
81
81
|
}
|
82
82
|
|
83
83
|
subject { Duck.where(:pond => 'Shin').rank(:age).to_a }
|
@@ -93,10 +93,10 @@ describe Duck do
|
|
93
93
|
describe "sorting by row" do
|
94
94
|
|
95
95
|
before {
|
96
|
-
@ducks[:beaky].
|
97
|
-
@ducks[:webby].
|
98
|
-
@ducks[:waddly].
|
99
|
-
@ducks[:wingy].
|
96
|
+
@ducks[:beaky].update :row_position => 0
|
97
|
+
@ducks[:webby].update :row_position => 2
|
98
|
+
@ducks[:waddly].update :row_position => 2
|
99
|
+
@ducks[:wingy].update :row_position => 6
|
100
100
|
}
|
101
101
|
|
102
102
|
subject { Duck.rank(:row).to_a }
|
@@ -112,13 +112,13 @@ describe Duck do
|
|
112
112
|
describe "mixed sorting by" do
|
113
113
|
|
114
114
|
before {
|
115
|
-
@ducks[:quacky].
|
116
|
-
@ducks[:beaky].
|
117
|
-
@ducks[:webby].
|
118
|
-
@ducks[:wingy].
|
119
|
-
@ducks[:waddly].
|
120
|
-
@ducks[:wingy].
|
121
|
-
@ducks[:webby].
|
115
|
+
@ducks[:quacky].update :size_position => 0
|
116
|
+
@ducks[:beaky].update :row_position => 0
|
117
|
+
@ducks[:webby].update :row_position => 2
|
118
|
+
@ducks[:wingy].update :size_position => 1
|
119
|
+
@ducks[:waddly].update :row_position => 2
|
120
|
+
@ducks[:wingy].update :row_position => 6
|
121
|
+
@ducks[:webby].update :row_position => 6
|
122
122
|
}
|
123
123
|
|
124
124
|
describe "row" do
|
@@ -153,7 +153,7 @@ describe Duck do
|
|
153
153
|
# puts Duck.rank(:age).collect {|duck| "#{duck.name} #{duck.age}" }
|
154
154
|
duck = Duck.rank(:age)[2]
|
155
155
|
expect(->{
|
156
|
-
duck.
|
156
|
+
duck.update :name => 'New Name'
|
157
157
|
}).to_not change(duck.reload, :age)
|
158
158
|
# puts Duck.rank(:age).collect {|duck| "#{duck.name} #{duck.age}" }
|
159
159
|
end
|
@@ -187,7 +187,7 @@ describe Duck do
|
|
187
187
|
|
188
188
|
before {
|
189
189
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect {|duck| duck.id }
|
190
|
-
@ducks[:wingy].
|
190
|
+
@ducks[:wingy].update :row_position => 2
|
191
191
|
}
|
192
192
|
|
193
193
|
context {
|
@@ -214,7 +214,7 @@ describe Duck do
|
|
214
214
|
|
215
215
|
before {
|
216
216
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect {|duck| duck.id }
|
217
|
-
@ducks[:wingy].
|
217
|
+
@ducks[:wingy].update :row_position => 0
|
218
218
|
}
|
219
219
|
|
220
220
|
context {
|
@@ -254,7 +254,7 @@ describe Duck do
|
|
254
254
|
|
255
255
|
context {
|
256
256
|
|
257
|
-
before { @ducks[:wingy].
|
257
|
+
before { @ducks[:wingy].update :row_position => (@ducks.size - 2) }
|
258
258
|
|
259
259
|
subject { Duck.ranker(:row).with(Duck.new).current_at_position(@ducks.size - 2).instance }
|
260
260
|
|
@@ -264,7 +264,7 @@ describe Duck do
|
|
264
264
|
|
265
265
|
context {
|
266
266
|
|
267
|
-
before { @ducks[:wingy].
|
267
|
+
before { @ducks[:wingy].update :row_position => :down }
|
268
268
|
|
269
269
|
subject { Duck.ranker(:row).with(Duck.new).current_at_position(@ducks.size - 2).instance }
|
270
270
|
|
@@ -278,7 +278,7 @@ describe Duck do
|
|
278
278
|
|
279
279
|
before {
|
280
280
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect {|duck| duck.id }
|
281
|
-
@ducks[:wingy].
|
281
|
+
@ducks[:wingy].update :row_position => (@ducks.size - 1)
|
282
282
|
}
|
283
283
|
|
284
284
|
context {
|
@@ -319,7 +319,7 @@ describe Duck do
|
|
319
319
|
|
320
320
|
before {
|
321
321
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect {|duck| duck.id }
|
322
|
-
@ducks[:wingy].
|
322
|
+
@ducks[:wingy].update :row_position => :last
|
323
323
|
}
|
324
324
|
|
325
325
|
context {
|
@@ -360,7 +360,7 @@ describe Duck do
|
|
360
360
|
|
361
361
|
before {
|
362
362
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect {|duck| duck.id }
|
363
|
-
@ducks[:wingy].
|
363
|
+
@ducks[:wingy].update :row_position => 'last'
|
364
364
|
}
|
365
365
|
|
366
366
|
context {
|
@@ -403,7 +403,7 @@ describe Duck do
|
|
403
403
|
|
404
404
|
before {
|
405
405
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect { |duck| duck.id }
|
406
|
-
@ducks[:wingy].
|
406
|
+
@ducks[:wingy].update :row_position => :down
|
407
407
|
}
|
408
408
|
|
409
409
|
context {
|
@@ -430,7 +430,7 @@ describe Duck do
|
|
430
430
|
|
431
431
|
before {
|
432
432
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:quacky].id).collect { |duck| duck.id }
|
433
|
-
@ducks[:quacky].
|
433
|
+
@ducks[:quacky].update :row_position => :down
|
434
434
|
}
|
435
435
|
|
436
436
|
context {
|
@@ -455,7 +455,7 @@ describe Duck do
|
|
455
455
|
|
456
456
|
before {
|
457
457
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:feathers].id).collect { |duck| duck.id }
|
458
|
-
@ducks[:feathers].
|
458
|
+
@ducks[:feathers].update :row_position => :down
|
459
459
|
}
|
460
460
|
|
461
461
|
context {
|
@@ -484,7 +484,7 @@ describe Duck do
|
|
484
484
|
|
485
485
|
before {
|
486
486
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect { |duck| duck.id }
|
487
|
-
@ducks[:wingy].
|
487
|
+
@ducks[:wingy].update :row_position => 'down'
|
488
488
|
}
|
489
489
|
|
490
490
|
context {
|
@@ -511,7 +511,7 @@ describe Duck do
|
|
511
511
|
|
512
512
|
before {
|
513
513
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:quacky].id).collect { |duck| duck.id }
|
514
|
-
@ducks[:quacky].
|
514
|
+
@ducks[:quacky].update :row_position => 'down'
|
515
515
|
}
|
516
516
|
|
517
517
|
context {
|
@@ -536,7 +536,7 @@ describe Duck do
|
|
536
536
|
|
537
537
|
before {
|
538
538
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:feathers].id).collect { |duck| duck.id }
|
539
|
-
@ducks[:feathers].
|
539
|
+
@ducks[:feathers].update :row_position => 'down'
|
540
540
|
}
|
541
541
|
|
542
542
|
context {
|
@@ -565,7 +565,7 @@ describe Duck do
|
|
565
565
|
|
566
566
|
before {
|
567
567
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect { |duck| duck.id }
|
568
|
-
@ducks[:wingy].
|
568
|
+
@ducks[:wingy].update :row_position => :up
|
569
569
|
}
|
570
570
|
|
571
571
|
context {
|
@@ -592,7 +592,7 @@ describe Duck do
|
|
592
592
|
|
593
593
|
before {
|
594
594
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:beaky].id).collect { |duck| duck.id }
|
595
|
-
@ducks[:beaky].
|
595
|
+
@ducks[:beaky].update :row_position => :up
|
596
596
|
}
|
597
597
|
|
598
598
|
context {
|
@@ -617,7 +617,7 @@ describe Duck do
|
|
617
617
|
|
618
618
|
before {
|
619
619
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:waddly].id).collect { |duck| duck.id }
|
620
|
-
@ducks[:waddly].
|
620
|
+
@ducks[:waddly].update :row_position => :up
|
621
621
|
}
|
622
622
|
|
623
623
|
context {
|
@@ -645,7 +645,7 @@ describe Duck do
|
|
645
645
|
Duck.where(id: @ducks[name].id).update_all(row: i)
|
646
646
|
@ducks[name].reload
|
647
647
|
end
|
648
|
-
@ducks[:wingy].
|
648
|
+
@ducks[:wingy].update :row_position => :up
|
649
649
|
}
|
650
650
|
|
651
651
|
context {
|
@@ -675,7 +675,7 @@ describe Duck do
|
|
675
675
|
|
676
676
|
before {
|
677
677
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:wingy].id).collect { |duck| duck.id }
|
678
|
-
@ducks[:wingy].
|
678
|
+
@ducks[:wingy].update :row_position => 'up'
|
679
679
|
}
|
680
680
|
|
681
681
|
context {
|
@@ -702,7 +702,7 @@ describe Duck do
|
|
702
702
|
|
703
703
|
before {
|
704
704
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:beaky].id).collect { |duck| duck.id }
|
705
|
-
@ducks[:beaky].
|
705
|
+
@ducks[:beaky].update :row_position => 'up'
|
706
706
|
}
|
707
707
|
|
708
708
|
context {
|
@@ -727,7 +727,7 @@ describe Duck do
|
|
727
727
|
|
728
728
|
before {
|
729
729
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_eq @ducks[:waddly].id).collect { |duck| duck.id }
|
730
|
-
@ducks[:waddly].
|
730
|
+
@ducks[:waddly].update :row_position => 'up'
|
731
731
|
}
|
732
732
|
|
733
733
|
context {
|
@@ -779,6 +779,44 @@ describe Duck do
|
|
779
779
|
}
|
780
780
|
end
|
781
781
|
|
782
|
+
describe "when moving between ponds should work when rebalancing" do
|
783
|
+
before do
|
784
|
+
[:feathers, :wingy, :webby, :waddly, :beaky].each_with_index do |name, i|
|
785
|
+
Duck.where(id: @ducks[name].id)
|
786
|
+
.update_all(age: RankedModel::MIN_RANK_VALUE + i, pond: "Boyden")
|
787
|
+
end
|
788
|
+
|
789
|
+
@ducks[:quacky].update!(age_position: 2, pond: "Boyden")
|
790
|
+
end
|
791
|
+
|
792
|
+
it 'rebalances ranks correctly' do
|
793
|
+
expect(@ducks[:feathers].reload.age_rank).to eq 0
|
794
|
+
expect(@ducks[:quacky].reload.age_rank).to eq 2
|
795
|
+
expect(@ducks[:beaky].reload.age_rank).to eq 5
|
796
|
+
end
|
797
|
+
|
798
|
+
context 'when attempting to update position to a non-unique value' do
|
799
|
+
before do
|
800
|
+
@duck_one = Duck.create(landing_order: RankedModel::MIN_RANK_VALUE,
|
801
|
+
lake_id: 42, flock_id: 42)
|
802
|
+
# Duck one's landing order will be rebalanced to -715_827_883.
|
803
|
+
# Given a unique index on [:landing_order, :lake_id, :flock_id] we
|
804
|
+
# verify that the operation succeeds despite the value already being
|
805
|
+
# occupied by duck two.
|
806
|
+
@duck_two = Duck.create(landing_order: -715_827_883,
|
807
|
+
lake_id: 42, flock_id: 42)
|
808
|
+
end
|
809
|
+
|
810
|
+
it 'rebalances ranks correctly' do
|
811
|
+
@ducks[:quacky].update!(landing_order_position: :first,
|
812
|
+
lake_id: 42, flock_id: 42)
|
813
|
+
expect(@ducks[:quacky].reload.landing_order_rank).to eq 0
|
814
|
+
expect(@duck_one.reload.landing_order_rank).to eq 1
|
815
|
+
expect(@duck_two.reload.landing_order_rank).to eq 2
|
816
|
+
end
|
817
|
+
end
|
818
|
+
end
|
819
|
+
|
782
820
|
end
|
783
821
|
|
784
822
|
describe Duck do
|
@@ -812,7 +850,7 @@ describe Duck do
|
|
812
850
|
}
|
813
851
|
@ducks.each { |name, duck|
|
814
852
|
duck.reload
|
815
|
-
duck.
|
853
|
+
duck.update :landing_order_position => 0
|
816
854
|
duck.save!
|
817
855
|
}
|
818
856
|
@ducks.each {|name, duck| duck.reload }
|
@@ -821,8 +859,8 @@ describe Duck do
|
|
821
859
|
describe "sorting by landing_order" do
|
822
860
|
|
823
861
|
before {
|
824
|
-
@ducks[:quacky].
|
825
|
-
@ducks[:wingy].
|
862
|
+
@ducks[:quacky].update :landing_order_position => 0
|
863
|
+
@ducks[:wingy].update :landing_order_position => 1
|
826
864
|
}
|
827
865
|
|
828
866
|
subject { Duck.in_lake_and_flock(0,0).rank(:landing_order).to_a }
|
@@ -846,10 +884,10 @@ describe Duck do
|
|
846
884
|
|
847
885
|
@previous_ranks = @untouchable_ranks.call
|
848
886
|
|
849
|
-
@ducks[:quacky].
|
850
|
-
@ducks[:wingy].
|
851
|
-
@ducks[:feathers].
|
852
|
-
@ducks[:wingy].
|
887
|
+
@ducks[:quacky].update :landing_order_position => 0
|
888
|
+
@ducks[:wingy].update :landing_order_position => 1
|
889
|
+
@ducks[:feathers].update :landing_order_position => 0
|
890
|
+
@ducks[:wingy].update :landing_order_position => 1
|
853
891
|
}
|
854
892
|
|
855
893
|
subject { @untouchable_ranks.call }
|
@@ -5,7 +5,7 @@ describe Duck do
|
|
5
5
|
before {
|
6
6
|
200.times do |i|
|
7
7
|
Duck.create \
|
8
|
-
:name => "Duck #{i}"
|
8
|
+
:name => "Duck #{i + 1}"
|
9
9
|
end
|
10
10
|
}
|
11
11
|
|
@@ -29,7 +29,7 @@ describe Duck do
|
|
29
29
|
|
30
30
|
before {
|
31
31
|
@last = Duck.last
|
32
|
-
@last.
|
32
|
+
@last.update :row_position => 137
|
33
33
|
}
|
34
34
|
|
35
35
|
subject { Duck.ranker(:row).with(Duck.new).current_at_position(137).instance }
|
@@ -42,7 +42,7 @@ describe Duck do
|
|
42
42
|
|
43
43
|
before {
|
44
44
|
@last = Duck.last
|
45
|
-
@last.
|
45
|
+
@last.update :row_position => 2
|
46
46
|
}
|
47
47
|
|
48
48
|
subject { Duck.ranker(:row).with(Duck.new).current_at_position(2).instance }
|
@@ -55,7 +55,7 @@ describe Duck do
|
|
55
55
|
|
56
56
|
before {
|
57
57
|
@last = Duck.last
|
58
|
-
@last.
|
58
|
+
@last.update :row_position => :last
|
59
59
|
}
|
60
60
|
|
61
61
|
subject { Duck.rank(:row).last }
|
@@ -68,7 +68,7 @@ describe Duck do
|
|
68
68
|
|
69
69
|
before {
|
70
70
|
@last = Duck.last
|
71
|
-
@last.
|
71
|
+
@last.update :row_position => :first
|
72
72
|
}
|
73
73
|
|
74
74
|
subject { Duck.rank(:row).first }
|
@@ -87,8 +87,8 @@ describe Duck do
|
|
87
87
|
@first = Duck.first
|
88
88
|
@second = Duck.offset(1).first
|
89
89
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_in([@first.id, @second.id])).collect {|d| d.id }
|
90
|
-
@first.
|
91
|
-
@second.
|
90
|
+
@first.update :row => RankedModel::MAX_RANK_VALUE
|
91
|
+
@second.update :row => RankedModel::MAX_RANK_VALUE
|
92
92
|
}
|
93
93
|
|
94
94
|
context {
|
@@ -105,13 +105,13 @@ describe Duck do
|
|
105
105
|
|
106
106
|
before {
|
107
107
|
Duck.first(50).each_with_index do |d, index|
|
108
|
-
d.
|
108
|
+
d.update :age => index % 10, :pond => "Pond #{index / 10}"
|
109
109
|
end
|
110
110
|
@duck_11 = Duck.where(:pond => 'Pond 1').rank(:age).first
|
111
111
|
@duck_12 = Duck.where(:pond => 'Pond 1').rank(:age).second
|
112
112
|
@ordered = Duck.where(:pond => 'Pond 1').rank(:age).where(Duck.arel_table[:id].not_in([@duck_11.id, @duck_12.id])).collect {|d| d.id }
|
113
|
-
@duck_11.
|
114
|
-
@duck_12.
|
113
|
+
@duck_11.update :age => RankedModel::MAX_RANK_VALUE
|
114
|
+
@duck_12.update :age => RankedModel::MAX_RANK_VALUE
|
115
115
|
}
|
116
116
|
|
117
117
|
context {
|
@@ -133,8 +133,8 @@ describe Duck do
|
|
133
133
|
@first = Duck.first
|
134
134
|
@second = Duck.offset(1).first
|
135
135
|
@ordered = Duck.rank(:row).where(Duck.arel_table[:id].not_in([@first.id, @second.id])).collect {|d| d.id }
|
136
|
-
@first.
|
137
|
-
@second.
|
136
|
+
@first.update :row => RankedModel::MIN_RANK_VALUE
|
137
|
+
@second.update :row => RankedModel::MIN_RANK_VALUE
|
138
138
|
}
|
139
139
|
|
140
140
|
context {
|
@@ -149,34 +149,30 @@ describe Duck do
|
|
149
149
|
|
150
150
|
describe "with no more gaps" do
|
151
151
|
|
152
|
-
before
|
152
|
+
before do
|
153
153
|
@first = Duck.rank(:row).first
|
154
154
|
@second = Duck.rank(:row).offset(1).first
|
155
155
|
@third = Duck.rank(:row).offset(2).first
|
156
|
-
@fourth = Duck.rank(:row).offset(
|
157
|
-
@fifth = Duck.rank(:row).offset(5).first
|
156
|
+
@fourth = Duck.rank(:row).offset(3).first
|
158
157
|
@lower = Duck.rank(:row).
|
159
|
-
where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id
|
158
|
+
where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id])).
|
160
159
|
where(Duck.arel_table[:row].lt(RankedModel::MAX_RANK_VALUE / 2)).
|
161
|
-
|
160
|
+
pluck(:id)
|
162
161
|
@upper = Duck.rank(:row).
|
163
|
-
where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id
|
162
|
+
where(Duck.arel_table[:id].not_in([@first.id, @second.id, @third.id, @fourth.id])).
|
164
163
|
where(Duck.arel_table[:row].gteq(RankedModel::MAX_RANK_VALUE / 2)).
|
165
|
-
|
166
|
-
@first.
|
167
|
-
@second.
|
168
|
-
@third.
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
it { is_expected.to eq([@first.id] + @lower + [@fourth.id, @third.id, @fifth.id] + @upper + [@second.id]) }
|
178
|
-
|
179
|
-
}
|
164
|
+
pluck(:id)
|
165
|
+
@first.update(row: RankedModel::MIN_RANK_VALUE)
|
166
|
+
@second.update(row: RankedModel::MAX_RANK_VALUE)
|
167
|
+
@third.update(row: (RankedModel::MAX_RANK_VALUE / 2))
|
168
|
+
@fourth.update(row: @third.row)
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'works correctly' do
|
172
|
+
result = Duck.rank(:row).pluck(:id)
|
173
|
+
expected = [@first.id, *@lower, @fourth.id, @third.id, *@upper, @second.id]
|
174
|
+
expect(result).to eq(expected)
|
175
|
+
end
|
180
176
|
|
181
177
|
end
|
182
178
|
|
data/spec/ego-model/ego_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe Ego do
|
|
10
10
|
}
|
11
11
|
@egos.each { |name, ego|
|
12
12
|
ego.reload
|
13
|
-
ego.
|
13
|
+
ego.update :size_position => 0
|
14
14
|
ego.save!
|
15
15
|
}
|
16
16
|
@egos.each {|name, ego| ego.reload }
|
@@ -19,8 +19,8 @@ describe Ego do
|
|
19
19
|
describe "sorting on size alternative primary key" do
|
20
20
|
|
21
21
|
before {
|
22
|
-
@egos[:nick].
|
23
|
-
@egos[:sally].
|
22
|
+
@egos[:nick].update :size_position => 0
|
23
|
+
@egos[:sally].update :size_position => 2
|
24
24
|
}
|
25
25
|
|
26
26
|
subject { Ego.rank(:size).to_a }
|
@@ -14,8 +14,8 @@ describe Number do
|
|
14
14
|
@first = Number.first
|
15
15
|
@second = Number.offset(1).first
|
16
16
|
@ordered = Number.rank(:order).where(Number.arel_table[:id].not_in([@first.id, @second.id])).collect {|d| d.id }
|
17
|
-
@first.
|
18
|
-
@second.
|
17
|
+
@first.update :order => RankedModel::MAX_RANK_VALUE
|
18
|
+
@second.update :order => RankedModel::MAX_RANK_VALUE
|
19
19
|
}
|
20
20
|
|
21
21
|
context {
|
@@ -28,4 +28,12 @@ describe Number do
|
|
28
28
|
|
29
29
|
end
|
30
30
|
|
31
|
+
describe "getting a position with keyword column name" do
|
32
|
+
|
33
|
+
subject { Number.first }
|
34
|
+
|
35
|
+
its(:order_rank) { should == 0 }
|
36
|
+
|
37
|
+
end
|
38
|
+
|
31
39
|
end
|
@@ -16,7 +16,7 @@ describe Player do
|
|
16
16
|
|
17
17
|
describe "setting the position of a record that already exists" do
|
18
18
|
it "sets the rank without error" do
|
19
|
-
expect{@players[:bob].
|
19
|
+
expect{@players[:bob].update! :score_position => 1}.to_not raise_error
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -62,3 +62,21 @@ describe RankedModel::Ranker, 'unless as Proc' do
|
|
62
62
|
}
|
63
63
|
end
|
64
64
|
end
|
65
|
+
|
66
|
+
describe RankedModel::Ranker, 'unless as lambda' do
|
67
|
+
context 'returns true' do
|
68
|
+
subject { RankedModel::Ranker.new(:overview, unless: ->(_) { true }).with(Class.new) }
|
69
|
+
its(:handle_ranking) { should == nil }
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'returns false' do
|
73
|
+
subject { RankedModel::Ranker.new(:overview, unless: ->(_) { false }).with(Class.new) }
|
74
|
+
|
75
|
+
it {
|
76
|
+
subject.expects(:update_index_from_position).once
|
77
|
+
subject.expects(:assure_unique_position).once
|
78
|
+
|
79
|
+
subject.handle_ranking
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
@@ -12,7 +12,7 @@ describe Element do
|
|
12
12
|
}
|
13
13
|
@elements.each { |name, element|
|
14
14
|
element.reload
|
15
|
-
element.
|
15
|
+
element.update :combination_order_position => 0
|
16
16
|
}
|
17
17
|
@elements.each {|name, element| element.reload }
|
18
18
|
}
|
@@ -20,9 +20,9 @@ describe Element do
|
|
20
20
|
describe "rebalancing on an STI class should not affect the other class" do
|
21
21
|
|
22
22
|
before {
|
23
|
-
@elements[:helium].
|
24
|
-
@elements[:xenon].
|
25
|
-
@elements[:argon].
|
23
|
+
@elements[:helium].update :combination_order_position => :first
|
24
|
+
@elements[:xenon].update :combination_order_position => :first
|
25
|
+
@elements[:argon].update :combination_order_position => :last
|
26
26
|
|
27
27
|
TransitionMetal.ranker(:combination_order).with(@elements[:chromium]).instance_eval { rebalance_ranks }
|
28
28
|
}
|
@@ -40,16 +40,16 @@ describe Element do
|
|
40
40
|
describe "setting positions on STI classes" do
|
41
41
|
|
42
42
|
before {
|
43
|
-
@elements[:helium].
|
44
|
-
@elements[:xenon].
|
45
|
-
@elements[:argon].
|
46
|
-
|
47
|
-
@elements[:chromium].
|
48
|
-
@elements[:manganese].
|
49
|
-
@elements[:manganese].
|
50
|
-
@elements[:chromium].
|
51
|
-
@elements[:manganese].
|
52
|
-
@elements[:chromium].
|
43
|
+
@elements[:helium].update :combination_order_position => :first
|
44
|
+
@elements[:xenon].update :combination_order_position => :first
|
45
|
+
@elements[:argon].update :combination_order_position => :first
|
46
|
+
|
47
|
+
@elements[:chromium].update :combination_order_position => 1
|
48
|
+
@elements[:manganese].update :combination_order_position => 1
|
49
|
+
@elements[:manganese].update :combination_order_position => 0
|
50
|
+
@elements[:chromium].update :combination_order_position => 0
|
51
|
+
@elements[:manganese].update :combination_order_position => 0
|
52
|
+
@elements[:chromium].update :combination_order_position => 0
|
53
53
|
}
|
54
54
|
|
55
55
|
describe "NobleGas" do
|
@@ -81,16 +81,16 @@ describe Element do
|
|
81
81
|
describe "setting positions on STI classes" do
|
82
82
|
|
83
83
|
before {
|
84
|
-
@elements[:helium].
|
85
|
-
@elements[:xenon].
|
86
|
-
@elements[:argon].
|
87
|
-
|
88
|
-
@elements[:chromium].
|
89
|
-
@elements[:manganese].
|
90
|
-
@elements[:manganese].
|
91
|
-
@elements[:chromium].
|
92
|
-
@elements[:manganese].
|
93
|
-
@elements[:chromium].
|
84
|
+
@elements[:helium].update :combination_order_position => :first
|
85
|
+
@elements[:xenon].update :combination_order_position => :first
|
86
|
+
@elements[:argon].update :combination_order_position => :first
|
87
|
+
|
88
|
+
@elements[:chromium].update :combination_order_position => 1
|
89
|
+
@elements[:manganese].update :combination_order_position => 1
|
90
|
+
@elements[:manganese].update :combination_order_position => 0
|
91
|
+
@elements[:chromium].update :combination_order_position => 0
|
92
|
+
@elements[:manganese].update :combination_order_position => 0
|
93
|
+
@elements[:chromium].update :combination_order_position => 0
|
94
94
|
}
|
95
95
|
|
96
96
|
describe "NobleGas" do
|