irb> my_array.sort_by { |e| [ e == 'chicken' ? 0 : e == 'beef' ? 1 : 2, e ] }
#=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
Это создаст ключ сортировки для каждого элемента массива, а затем отсортирует элементы массива по их ключам сортировки. Поскольку ключ сортировки является массивом, он сравнивается по позиции, поэтому [0, 'chicken'] < [1, 'beef'] < [2, 'apple' ] < [2, 'banana']
.
Если вы не знаете, какие элементы вы хотели отсортировать на передний план до времени выполнения, вы все равно можете использовать этот трюк:
irb> promotables = [ 'chicken', 'beef' ]
#=> [ 'chicken', 'beef' ]
irb> my_array.sort_by { |e| [ promotables.index(e) || promotables.size, e ] }
#=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
irb> promotables = [ 'tofu', 'mushroom' ]
#=> [ 'tofu', 'mushroom' ]
irb> my_array.sort_by { |e| [ promotables.index(e) || promotables.size, e ] }
#=> [ "tofu", "mushroom", "beef", "chicken", "fish", "lamb"]