Skip to content
This repository has been archived by the owner on Dec 28, 2017. It is now read-only.

akicho8/static_record

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

57 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

StaticRecord はもうメンテナンスしていません。かわりに memory_record gem を使ってみてください。

少数のレコード簡単に扱うライブラリ

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) では何にもマッチしません。

code を自分で決めたいときは?

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]

レガシーなコードをリファクタリングするときの、互換性が必要なときにぐらいにしか使わない。

配列として回すには?

Enumerable が入っているので each 系メソッドが利用可

Foo.each {|v| ... }
Foo.collect {|v| ... }

Railsでフォームの select に出すときは?

form.collection_select(:selection_code, Foo, :code, :name)

添字での参照は遅い?

内部で key の値をキーとしたハッシュを持っているため O(1) で取得できる。

Foo[1].name  # => "A"
Foo[:a].name # => "A"

インスタンスは codekey に必ず反応する

object = Foo.first
object.key  # => :a
object.code # => 1

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 を定義している。

キーがなければエラーとするには?

Foo.fetch(:xxx)              # => <KeyError: ...>

以下は全部同じ

Foo[:xxx] || :default        # => :default
Foo.fetch(:xxx, :default}    # => :default
Foo.fetch(:xxx) { :default } # => :default

値が nil だったらスルーしたいときは?

Foo.fetch_if(nil)            # => nil
Foo.fetch_if(:a)             # => #<Foo:... @attributes={...}>
Foo.fetch_if(:xxx)           # => <KeyError: ...>

About

少数のレコードを簡単に扱うライブラリ

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages