今回はComparebleを使って自前クラスにsortの挙動を実装します。
正確には、sort内で判定に使われる"<=>"メソッドの挙動を定義する事で実現します。
class Book include Comparable attr_accessor :name, :genre def initialize(name, genre=nil) @name = name @genre = genre end def <=>(other) t = @genre.to_s <=> other.genre.to_s return t if t != 0 return @name <=> other.name end end
これを実際つかってみると...
require 'pp' ary = [] ary << Book.new('foo', 'Linux') ary << Book.new('bar', 'AVR') ary << Book.new('buzz', 'AVR') ary.sort.each {|io| pp io} # => [#<Book:0x007fbb7a8f3990 @name="bar", @genre="AVR">, #<Book:0x007fbb7a8f3918 @name="buzz", @genre="AVR">, #<Book:0x007fbb7a8f3a08 @name="foo", @genre="Linux">] # >> #<Book:0x007fbb7a8f3990 @genre="AVR", @name="bar"> # >> #<Book:0x007fbb7a8f3918 @genre="AVR", @name="buzz"> # >> #<Book:0x007fbb7a8f3a08 @genre="Linux", @name="foo">
こんな感じでソートされます。
読み出し済なモデルをちょいちょいとソートして配列にぶっ込んだり、
いやそもそもDBなんか使いたく無いって場合には有効です...かね?
つづき
多少理解が進んだので、続きを書きましたshuzo-kino.hateblo.jp