Вы не говорите, какие dmbs вы используете - в msysql вы можете сделать условный порядок, например
:order => "IF(zipcode = '#{params[:zipcode]}', 0, 1)"
Другие dbms могут делать это по-другому, хотя я думаю, что это стандартно. Альтернативный способ сделать это -
:order => "(zipcode = '#{params[:zipcode]}') desc)"
Описание desc просто необходимо, потому что тест if, неявный в приведенном выше, возвращает 1 для true и 0 для false, а 1 следует после 0, поэтому истинные результаты следуют после false. Отсюда desc, чтобы подтолкнуть истинных к вершине.
Я немного смущен тем, что именно ты хочешь делать. Если вы хотите найти все результаты, в которых состояние или почтовый индекс совпадает с параметрами [: zipcode], но переместите те, которые соответствуют почтовому индексу, на верх, это будет
YourModel.find(:all,
:conditions => ["zipcode = ? or state = ?", params[:zipcode], params[:zipcode]],
:order => "IF(zipcode = '#{params[:zipcode]}', 0, 1)")
Если вы хотите сначала упорядочить по другим столбцам (в соответствии с заголовком сообщения), просто поставьте их перед вызовом IF в опции заказа, например,
:order => "name, IF(zipcode = '#{params[:zipcode]}', 0, 1), zipcode"