2011-02-08 8 views
1

これで、うまく動作するデータベース列の代わりに結果をソートする方法があります。これは、各レコードに対する値と各ループの下に、これらに基づいてテーブルを並べ替えるから返されます:値が空でない場合は、sort_byメソッドをレンダリングします。

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

これは本当にうまく機能 - ユーザーがレコード自体と相互作用した後に、この方法でのみ使用されますが。たとえばレーティングのように、レコーディングはレーティングなしで始まり、レーティングはこのポイントの後に提出されます。

ソートする値がない新しいレコードを作成するまでうまくいきます - 「レコードが値を持たない場合は、このメソッドが返すものでソートします。これのために、それを底に置くのですか? "それは数「はNaN」ではないですので、私は例外を取得...それは空だから:(

いつものように瞬間

- 大規模こちらのRails初心者のための感謝任意の助けを...

答えて

3

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

感謝を - 「NaNの」 – Jamie

+0

は異なる手法で答えを更新しましたけれども、まだ同じことを得ます。それが動作するかどうか私に教えてください。 – Dogbert

+0

残念ながら、同じ結果が得られます:(素晴らしいですが、NaNの場合はチェックして番号に変換することを考えた方がよいでしょう – Jamie

3

そのと仮定すると:この

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

編集をお試しください常に(メソッドとして)存在し、値が存在する場合に数値を返すとnilまたはfalseそうでない場合:

@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 
+0

あなたにはありがとうございます - それは今の値をチェックすることで今すぐ並べ替えました。存在し、メソッドに与えられます。それ以外の場合は0を返します。 – Jamie

+0

パーティション上の素晴らしいアイデア。 Rubyにそのメソッドが存在しているかどうか知りませんでした。 – Nuby

+0

@Nuby、それはRubyの[Enumerable](http://www.ruby-doc.org/core/classes/Enumerable.html)モジュールの一部です。これは、配列、ハッシュなどのコレクションを扱うための素敵なものです。 –

関連する問題