2012-06-16 137 views
0

我正在为我的Rails应用程序的一些规格工作,涉及重新排序数据库中的模型。由于模型标识未提前知道,因此我不想对“模型标识列表应该是[1,2,3]”进行硬编码,所以我只是将它们收集到一个数组中作为一个数组,我创建它们,例如从其他阵列的红宝石切片阵列

(1..3).each 
    ids << Model.create().id 

Model.find(:all, order: position).should == ids 

不管怎样,我想测试需要订​​购ID列表我重新排序逻辑:

Model.reorder([3,1,2]) # will change position in db 

让事情干了,我只是做:

reordered_ids = [ids[3], ids[1], ids[2]] 
Model.reorder(reordered_ids) 

Model.find(...).should == reordered_ids 

我很好奇,如果有一个更优雅的方式去做

reordered_ids = [ids[3], ids[1], ids[2]] 

这工作,但似乎并不更好:

[3,1,2].collect{|i| ids[i] } 

任何想法?

回答

1

reordered_ids = [IDS [3],ID为[1],IDS [2]]

reordered_ids = ids.values_at(3, 1, 2) 

(1..3)。每个IDS < < Model.create( ).ID

ids = 3.times.map { Model.create.id } 
0

我的答案是不完全是你问什么,但也许你需要什么。

如何自己没有决定重新排序并做了洗牌,像

reordered_ids = ids.shuffle 

更新: 后正确的作者的评论指出,这存在着洗牌将是未排序的低优先级,并他希望它是明确的,我想我们可以简单地颠倒这种情况下的顺序,使其明确。例如

reordered_ids = ids.reverse 
+1

有一些低序概率的混洗阵列将被排序,因此不测试任何东西。我认为对于一个规范来说,它应该是明确的 –