2012-06-16 3 views
0

Я работаю над некоторыми спецификациями для моего приложения Rails, которое включает в себя переопределение моделей в базе данных.Ruby Slice Array из другого массива

Поскольку идентификаторы модели не известны заранее, я не хочу жестко кодировать «Список идентификаторов модели должен быть [1,2,3]», поэтому я просто собираю их в массиве как Я создаю их, например

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

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

Во всяком случае, я хочу, чтобы проверить свое переназначение логика, которая принимает список упорядоченных идентификаторов:

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

держать вещи DRY Я просто:

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 = [Идентификаторы [3], идентификаторы [1], идентификаторы [2]]

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

(1..3) .each идентификаторы < < Model.create () .id

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

Мой ответ не совсем то, что вы просили, но, вероятно, что вам нужно.

Как насчет не решая изменить порядок себя и делать перетасовать, как

reordered_ids = ids.shuffle 

Update: После правильно указал на автора комментария, что есть низкий приоритет, что перетасовать будет несортированный, и он хочет, чтобы он был явным, я думаю, что мы можем просто изменить порядок в этом случае, чтобы сделать его явным. например

reordered_ids = ids.reverse 
+1

Существует некоторая вероятность низкого порядка сортировки перепутанного массива, поэтому не тестируется. Я думаю, что для спецификации он должен быть явным –

Смежные вопросы