StaticRecord はもうメンテナンスしていません。かわりに [[https://github.com/akicho8/memory_record][memory_record]] gem を使ってみてください。
- 少数のレコード簡単に扱うライブラリ
#+BEGIN_SRC ruby
class Direction
include StaticRecord
static_record [
{key: :left, name: "左", vector: [-1, 0]},
{key: :right, name: "右", vector: [ 1, 0]},
], attr_reader_auto: true
def long_name
"#{name}方向"
end
end
Direction.collect(&:name) # => ["左", "右"]
Direction.keys # => [:left, :right]
Direction[:right].key # => :right
Direction[:right].code # => 1
Direction[:right].vector # => [1, 0]
Direction[:right].long_name # => "右方向"
Direction[1].key # => :right
Direction[:up] # => nil
Direction.fetch(:up) rescue $! # => #<KeyError: Direction.fetch(:up) では何にもマッチしません。
#+END_SRC
*** =code= を自分で決めたいときは?
#+BEGIN_SRC ruby
class Foo
include StaticRecord
static_record [
{code: 1, key: :a, name: "A"},
{code: 2, key: :b, name: "B"},
{code: 3, key: :c, name: "C"},
], attr_reader: :name
end
Foo.collect(&:code) # => [1, 2, 3]
#+END_SRC
レガシーなコードをリファクタリングするときの、互換性が必要なときにぐらいにしか使わない。
*** 配列として回すには?
=Enumerable= が入っているので =each= 系メソッドが利用可
#+BEGIN_SRC ruby
Foo.each {|v| ... }
Foo.collect {|v| ... }
#+END_SRC
*** Railsでフォームの select に出すときは?
#+BEGIN_SRC ruby
form.collection_select(:selection_code, Foo, :code, :name)
#+END_SRC
*** 添字での参照は遅い?
内部で key の値をキーとしたハッシュを持っているため O(1) で取得できる。
#+BEGIN_SRC ruby
Foo[1].name # => "A"
Foo[:a].name # => "A"
#+END_SRC
*** インスタンスは =code= と =key= に必ず反応する
#+BEGIN_SRC ruby
object = Foo.first
object.key # => :a
object.code # => 1
#+END_SRC
*** =attr_reader= オプションとは?
属性は =@attributes[:xxx]= で参照できるが、頻繁に参照するときには面倒なので =:attr_reader => :xxx= でメソッド化している。
*** =attr_reader_auto= オプションとは?
属性をすべて =attr_reader= する
*** レコードの属性に気軽にアクセスさせたくないときは?
=attr_reader= でメソッド定義せず =object.attributes[:xxx]= で参照する。
*** インスタンスにメソッドを追加するには?
そのために新しくクラスを作っているので普通に定義すればいい。
*** =name= メソッドは特別?
=name= が定義されてなかったら =key= の翻訳を返す =name= メソッドを定義している。
*** =to_s= メソッドが定義されている?
=name= の別名で =to_s= を定義している。
*** キーがなければエラーとするには?
#+BEGIN_SRC ruby
Foo.fetch(:xxx) # => <KeyError: ...>
#+END_SRC
以下は全部同じ
#+BEGIN_SRC ruby
Foo[:xxx] || :default # => :default
Foo.fetch(:xxx, :default} # => :default
Foo.fetch(:xxx) { :default } # => :default
#+END_SRC
*** 値が nil だったらスルーしたいときは?
#+BEGIN_SRC ruby
Foo.fetch_if(nil) # => nil
Foo.fetch_if(:a) # => #<Foo:... @attributes={...}>
Foo.fetch_if(:xxx) # => <KeyError: ...>
#+END_SRC