Во-первых, нормализуйте ваши данные , вы не можете работать с целыми числами в виде строк:
wardList = wardList.map { |x| x.merge({:id => x[:id].to_i,
:seqno => x[:seqno].try(:to_i) }) }
Тогда вы можете использовать sort_by
, который поддерживает лексикографическую сортировку:
wardList.sort_by! { |x| [x[:seqno] || Float::INFINITY, x[:name]] }
Пример:
irb(main):034:0> a = [{:seqno=>5, :name=>"xsd"},
{:seqno=>nil, :name=>"foo"},
{:seqno=>nil, :name=>"bar"},
{:seqno=>1, :name=>"meh"}]
irb(main):033:0> a.sort_by { |x| [x[:seqno] || Float::INFINITY, x[:name]] }
=> [{:seqno=>1, :name=>"meh"},
{:seqno=>5, :name=>"xsd"},
{:seqno=>nil, :name=>"bar"},
{:seqno=>nil, :name=>"foo"}]