2013-07-13 2 views
1

Я приказываю посты в моей модели истории атрибутом Title, как это:Как заказать сообщения Имя - Рельсы

def index 
    @histories = History.all(:order => 'title') 
end 

У меня есть следующие заголовки статей:

  • Post 1
  • сообщение 2
  • сообщение 11

проблема у меня в том, что «Post 11» появляется перед «Post 2». Как я могу убедиться, что сообщения упорядочены правильно? (Я хочу, чтобы сообщение 2 появлялось перед сообщением 11).

Спасибо.

ответ

2

Поэтому я предположил, что это формат заголовка является обычным в вашей модели.

Сначала я хотел бы добавить этот метод к модели истории:

def numerized_title 
    return 0 unless title.present? 
    Integer(title.tr('^0-9','')) 
end 

Тогда в контроллере:

@histories = History.all.sort_by(&:numerized_title) 

Вместо того, чтобы пытаться с каким-то противным MySQL вы можете просто использовать это в заявлении и вы можете протестировать его для всех видов title, если он работает.

Имейте в виду, что Integer(str) поднимет Исключение, если он не сможет создать Fixnum.

+0

Thanks. Он работает отлично. – ChrisBedoya

0

Не проверял его, но я думаю, что следующее должно работать.

def index 
    @histories = History.all(:order => 'REPLACE(title,"Post","")+0 ASC') 
end 


mysql> desc z; 
+------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| a  | varchar(255) | YES |  | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 


mysql> select * from z; 
+---------+ 
| a  | 
+---------+ 
| post 1 | 
| post 11 | 
| post 2 | 
+---------+ 
3 rows in set (0.00 sec) 



mysql> select * from z order by a asc; 
+---------+ 
| a  | 
+---------+ 
| post 1 | 
| post 11 | 
| post 2 | 
+---------+ 
3 rows in set (0.00 sec) 

    mysql> select * from z order by REPLACE(a,"post","")+0 ASC; 
+---------+ 
| a  | 
+---------+ 
| post 1 | 
| post 2 | 
| post 11 | 
+---------+ 
3 rows in set (0.00 sec) 
+0

Единственная проблема с этим кодом в том, что сообщение 1 появляется после Post 2 – ChrisBedoya

+0

Check it out now ... – beck03076

0

Вы можете использовать ASC или DESC параметр после поля

def index 
    @histories = History.all(:order => 'title ASC') 
end 
Смежные вопросы