読者です 読者をやめる 読者になる 読者になる

kmasdaの日記

rubyとかrailsとかそれっぽいことを

enumとかenumerizeとか

2/15のsendagaya.rbに参加してenumについての話が出ました。

enumを使った時のDBの型は何を使っているかって話になった。 通常であればinteger型で

class Person < ActiveRecord::Base
  enum :sex { male: 1, female:2 }
end

とかやったりする。 でも、クエリとか組むときこの1とか2が何を表現するのかわからない。 エンジニアであればコードみればいいけど、非エンジニア見たときそれぞれが何を表現するのか不明だ!みたいな切り出しだったと思う。

でそこからenumerizeの話になってそこらへんからよくわからなくなって話についていけなくなった。

からここからは自分で調べて何となく自分で理解した内容をつらつら書く。

enum

rails 4.1以降にrailsに入った機能

Riding Rails: Rails 4.1.0: Spring, Variants, Enums, Mailer previews, secrets.yml

該当箇所には

Enums wraps the pattern of having a status field constrained to just a few options. It's just enough syntactic sugar to make tinyint-backed status fields taste delicious while still reaping the optimization benefit of avoiding repeated status strings. Poor man's state machine? Nah, Just Enough for Most of the Time.

と書いてある。 StateMachineなので多分状態の遷移が前提になってくるってことかな?

だとすると最初に上がった、male, femaleは遷移する状態を表すのには不適切かもしれない。まー変わることもあるけど、、、 それぞれで振る舞いを変えるならSTIでの実装?とかになるのかな?、、、話がそれそう。

アンダースタンディング コンピュテーション――単純な機械から不可能なプログラムまでにはstateMachineについてこんな感じで記述してあった。

幾つかの取り得る状態(state)と現在どの状態にいるかを記録する最小限の機能を備えた機械(finite state machine)

アマゾンの商品注文してから注文履歴で商品の状態を知るのとかenumで管理するみたいなイメージかな。

何かを受け取って特定の状態に遷移するって意味ではこれも多分そう。 https://www.bugzilla.org/docs/2.18/html/lifecycle.html

enumerize

正直使ったことないからわからない。

github.com

Enumerated attributes with I18n and ActiveRecord/Mongoid/MongoMapper/Sequel support

modelの属性についての管理をするgemって認識

まとめ

多分名前似てるし、記述の仕方も似てるがら誤解しそうだけど目的とか用途が違うから混同しないようにしないといけないと思った。 で、最初の問題(DBにどんな型で持つんだ!!)は属性についてはstringでもってシステムの移行リスクを減らたい。 状態の管理については時と場合によるけどinsert,updateの処理が多そうなのでintegerで管理する方がベター。 そのかわり、利用関係者に対しては説明やら理解を得ることが必要っぽい。