完全一致、前方一致、部分一致の3検索をする以上selectが3回必要なのは仕方ないんじゃないだろうか。
Item.find_by_sql <<SQL
SELECT * FROM (
SELECT 1 AS sort_key, * FROM items WHERE name LIKE "aaa"
UNION SELECT 2 AS sort_key, * FROM items WHERE name LIKE "a%"
UNION SELECT 3 AS sort_key, * FROM items WHERE name LIKE "%a%") ORDER BY sort_key ASC
SQL
とか。(てきとう)

トータルの該当検索件数が大したことないなら、
それぞれの一致方式で個別にfindした結果を連結し、そいつに、
will_paginateが必要とするメソッドを特異メソッドとして実装するという手もある。
(total_pages, current_page, previous_page, next_pageメソッドを定義すればいい)


あと、likeの引数に任意の外部入力文字列を安全に埋め込むのは結構面倒だと思うのでがんばって。