我正在按属性标题对模型历史记录中的帖子进行排序,如下所示:
def index
@histories = History.all(:order => 'title')
end
我有以下帖子标题:
- 帖子 1
- 帖子 2
- 帖子 11
我遇到的问题是“Post 11”出现在“Post 2”之前。如何确保帖子的排序正确?(我希望帖子 2 出现在帖子 11 之前)。
谢谢。
我正在按属性标题对模型历史记录中的帖子进行排序,如下所示:
def index
@histories = History.all(:order => 'title')
end
我有以下帖子标题:
我遇到的问题是“Post 11”出现在“Post 2”之前。如何确保帖子的排序正确?(我希望帖子 2 出现在帖子 11 之前)。
谢谢。
所以我认为这种标题格式在你的模型中是传统的。
首先,我将此方法添加到 History 模型中:
def numerized_title
return 0 unless title.present?
Integer(title.tr('^0-9',''))
end
然后在控制器中:
@histories = History.all.sort_by(&:numerized_title)
您可以在应用程序中使用它,而不是尝试使用一些讨厌的 mysql,并且您可以测试它是否可以title
正常工作。
Keep in mind Integer(str)
will raise an Exception if it's not able to generate a Fixnum
.
尚未对其进行测试,但我认为以下应该有效。
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)
您可以在字段后使用 ASC 或 DESC 选项
def index
@histories = History.all(:order => 'title ASC')
end