如果value不为空,则Rails sort_by方法

时间:2011-02-08 21:22:48

标签: ruby-on-rails ruby ruby-on-rails-3

所以我有一个方法,我用它来排序结果而不是数据库列,目前效果很好。它将从每个循环的下面返回一个值,对每条记录,然后根据这些对表进行排序:

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

这非常有效 - 但是此方法仅在用户与记录本身交互后才会使用。例如,如评级,那么记录将在没有评级的情况下开始生活,然后在此之后提交评级。

它工作得很好,直到你创建一个没有值的新记录来排序 - 有没有办法说“按这个方法返回的方式排序,如果记录没有值这个,把它放在底部“?

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

一如既往 - 任何帮助Rails初学者都非常感激......!

2 个答案:

答案 0 :(得分: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| %>

答案 1 :(得分:3)

假设methodName始终存在(作为方法),并在值存在时返回Numeric,否则返回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