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"]
если 'курица' или 'говядина' встречаются больше (или меньше), чем один раз в 'my_array' тогда результат этого не будет переупорядочением 'my_array'. – rampion
Комментарий Rampion не кажется правильным с Ruby 2.2.2 на момент написания. – Scott