1

我正在按属性标题对模型历史记录中的帖子进行排序,如下所示:

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

我有以下帖子标题:

  • 帖子 1
  • 帖子 2
  • 帖子 11

我遇到的问题是“Post 11”出现在“Post 2”之前。如何确保帖子的排序正确?(我希望帖子 2 出现在帖子 11 之前)。

谢谢。

4

3 回答 3

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正常工作。

Keep in mind Integer(str) will raise an Exception if it's not able to generate a Fixnum.

于 2013-07-14T09:08:40.957 回答
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)
于 2013-07-13T22:57:51.227 回答
0

您可以在字段后使用 ASC 或 DESC 选项

def index
  @histories = History.all(:order => 'title ASC')
end 
于 2013-07-13T23:16:35.803 回答