回答:
代わりにsort_byを使用することをお勧めします。
objects.sort_by {|obj| obj.attribute}
特に属性が計算される場合があります。
または、より簡潔なアプローチ:
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(たとえば速度など)?
はい、Array#sort!
これは簡単に使用できます。
myarray.sort! { |a, b| a.attribute <=> b.attribute }
<=>
か?どのようなエラーが発生していますか?など、悪心。言い換えれば、「私には運がない」よりも詳細な情報が必要です。
sort
オリジナルを保持して結果を別のオブジェクトに割り当てる場合に使用します。それ以外の場合は、インプレースバリアントを使用しsort!
ます。実際、元のオブジェクトをコピーした後、内部的にsort
呼び出しsort!
ます。
sort!
。常に(!)あなたが書いたものと同じことを行います。
<=>メソッドをオーバーライドすることで、任意のクラスをソート可能にすることができます。
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(other)
@last_name + @first_name <=> other.last_name + other.first_name
end
end
これで、Personオブジェクトの配列がlast_nameでソート可能になります。
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
@model_name.sort! { |a,b| a.attribute <=> b.attribute }
sort
直接比較できないオブジェクトを並べ替える場合は使用しないでください。属性にアクセスする必要がある場合、または比較する値を取得するために計算を行う必要がある場合sort_by
。それははるかに速くなります。
objects.sort_by(&:attribute)