5

したがって、user.dj_name 属性を持つユーザーが多数います。これはモデルの検証済みの必要性ですが、問題が発生しているため、ここではまだ慎重です。

多数のユーザーを取得し、dj_name で並べ替えたいと考えています。このようなもの:

@djs = Event.all.map { |e| e.program.user }.sort_by {|x,y| x.dj_name <=> y.dj_name }

イベント(ショー)を持っているすべてのDJを引っ張っています。「NoMethodError: undefined method `dj_name' for nil:NilClass」で失敗します

だから私は試しました:

@djs = Event.all.map { |e| e.program.user }
@djs.compact.sort_by! {|x,y| x.dj_name <=> y.dj_name rescue nil}

そして、それはソートされません。「rescue nil」句がないと、同じエラーが発生します。

そして、私が拒否した場合!オブジェクトが nil の場合、何も取得しません。

> @djs.reject! {|d| d.nil? }
=> nil 

配列内のオブジェクトはどれも nil ではないようです。並べ替えメカニズムでエラーが発生し、それを救うと並べ替えプロセスが停止し、変更されていない配列が返されます。

半分?

4

2 に答える 2

2

この種のタスクには、データベースの並べ替えを使用します。以下を使用してクエリを再開できます。

Event.all(:include => {:program => :user}, :order => 'users.dj_name')

このクエリを切り離すと、includeメソッドはモデルで結合の関連付けを作成し、クエリでorderを作成ORDER BYします。

于 2013-06-06T22:56:10.287 に答える
2

sort!ではなく、使用してくださいsort_by!

sort_by!単一の引数をそのブロックに渡します。したがって、 を呼び出すと.sort_by! {|x,y| ... }yは常にになりnilます。

の目的はsort_by!、要素ではなくキーでソートすることです。ブロックは単一の要素を取得し、並べ替えに使用する要素のキーを返す必要があります。

このコードでは:

@djs.compact.sort_by! {|x,y| x.dj_name <=> y.dj_name rescue nil}

ブロックはすべての要素nilのキーとして返されます。その結果、ソートは行われません。

ところで、私は@MurifoXに同意します。この特定のケースでは、データベース提供のソートを行う必要があります。

于 2013-06-06T23:36:48.387 に答える