如何按名称订购帖子 - rails

时间:2013-07-13 22:29:10

标签: ruby-on-rails

我按照属性Title命名我的模型历史记录中的帖子:

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

我有以下帖子标题:

  • Post 1
  • Post 2
  • Post 11

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

感谢。

3 个答案:

答案 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