我按照属性Title命名我的模型历史记录中的帖子:
def index
@histories = History.all(:order => 'title')
end
我有以下帖子标题:
我遇到的问题是'Post 11'出现在'Post 2'之前。如何确保帖子订购正确? (我希望Post 2出现在Post 11之前)。
感谢。
答案 0 :(得分:2)
所以我认为这种标题格式在你的模型中是常规的。
首先,我将此方法添加到History模型中:
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
,则会引发异常。
答案 1 :(得分: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)
答案 2 :(得分:0)
您可以在字段
后使用ASC或DESC选项def index
@histories = History.all(:order => 'title ASC')
end