クラスがある場合Place
:
class Place
attr_accessor :phone, :category, :street, :website, :zip
end
そしてインスタンスを作成しますplace1
:
place1 = Place.new
place1.instance_variables # => []
place1.instance_variables.size # => 0
place1.phone = '555-1212' # => "555-1212"
place1.instance_variables # => [ :@phone ]
place1.instance_variables.size # => 1
そして、次のインスタンスを作成します:
place2 = Place.new
place2.phone = '555-1212'
place2.zip = '00000'
place2.instance_variables # => [ :@phone, :@zip ]
place2.instance_variables.size # => 2
設定されているインスタンス変数の昇順で並べ替えることができます。
[place1, place2].sort_by{ |p| p.instance_variables.size }
# => [ #<Place:0x007fa8a32b51a8 @phone="555-1212">, #<Place:0x007fa8a31f5380 @phone="555-1212", @zip="00000"> ]
または降順で並べ替えます。
[place1, place2].sort_by{ |p| p.instance_variables.size }.reverse
# => [ #<Place:0x007fa8a31f5380 @phone="555-1212", @zip="00000">, #<Place:0x007fa8a32b51a8 @phone="555-1212"> ]
これは基本的な Ruby オブジェクトを使用し、Rails は必要なく、オブジェクト インスタンス自体に何が設定されているかを尋ねるため、属性の外部リストを維持する必要はありません。
注: インスタンス変数を何かに設定してから に戻すと、これが壊れますnil
。
これで修正されます:
[place1,place2].sort_by{ |p|
p.instance_variables.reject{ |v|
p.instance_variable_get(v).nil?
}.size
}.reverse
count
これは、Enumerableをブロックで使用することで短縮されます。
[place1,place2].sort_by{ |p|
p.instance_variables.count{ |v|
!p.instance_variable_get(v).nil?
}
}.reverse