2011-02-08 127 views
1

所以我有一种方法,我正在使用的结果,而不是一个数据库列的工作很好地排序。它将从返回每个环路下面针对每个记录的值,然后进行排序基于这些表:Rails sort_by方法,如果值不为空

<% @records.sort_by(&:methodName).reverse.each do |record| %> 
    <%= record.methodName %> 
<% end %> 

这个作品真的很好 - 但是这种方法的用户之后,只得到使用记录本身交互。比如像一个评级,所以一个记录将开始没有评级的生活,那么评级将在此之后提交。

它很好地工作,直到你创建一个新的记录,没有这个值排序 - 是否有一种方式说:“按照这个方法返回的内容排序,如果记录没有值为此,把它放在底部“?

目前,我得到一个例外,因为它不是一个数字“男” ......因为它是空的:(

一如往常 - 大规模赞赏Rails的初学者在这里..

回答

3

任何帮助试试这个

<% @records.sort_by{|r| r.try(:methodName)}.reverse.each do |record| %> 

编辑:

<% @records.sort_by{|r| r.methodName.nan? ? 10000 : r.methodName}.reverse.each do |record| %> 
+0

感谢您的回答家伙 - 仍然得到同样的事情,但“男” – Jamie 2011-02-08 21:29:08

+0

更新了不同的技术答案。让我知道它是否有效。 – Dogbert 2011-02-08 21:33:07

3

假设methodName始终存在(作为一种方法),当值存在,并且nilfalse否则返回一个数字:

@records.sort_by{ |r| r.methodName || -9999999 } 

这将导致所有的记录,没有进入在列表的开始reverse面前,之后列表的末尾。

如果这不起作用,请说明methodName返回的新记录。

或者,你可以这样做:

newrs, oldrs = @records.partition{ |r| r.methodName } 
newrs.each do |r| ... records that have a value for methodName ... end 
oldrs.each do |r| ... records with no value for methodName ... end