enumについて
sendagaya.rbに参加させていただきました。
ActiveRecordでenum
という型を使っているかというお話になりました。
自分はenum
自体全く馴染みがなかったので、調べてみました。
C+をやっている方には馴染みがあるようですね。
enum キーワードは、列挙型を宣言するために使用されます。
列挙型は、列挙子リストと呼ばれる名前付き定数の集まりで構成される固有の型です。
通常、列挙型は名前空間内に直接定義して、名前空間内のすべてのクラスが共通の利便性でアクセスできるようにするのが最も適切です。ただし、列挙型はクラスまたは構造体内に入れ子にすることもできます。
既定では、最初の列挙子の値は 0 で、後続の列挙子の値は 1 ずつ増加していきます。たとえば、次の列挙型では、Sat は 0、Sun は 1、Mon は 2 などとなります。
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
これを利用することでステータス管理に利用できたりします。
例えば、本を販売しているとして、「セール」「販売」「売り切れ」という状態があったとします。
rails g model book name:string status:integer
models/book.rb
class Book < ActiveRecord::Base enum status: %i(sell sale soldout) end
db/migrate/timestamp_create_books.rb
class CreateBooks < ActiveRecord::Migration def change create_table :books do |t| t.string :name t.integer :status t.timestamps null: false end end end
実際にデータを入れてみます。
irb(main):001:0> Book.create(name: 'book', status: :sell) => #<Book id: 1, name: "book", status: 0, created_at: "2016-02-16 02:24:21", updated_at: "2016-02-16 02:24:21">
これで使い方としてはステータスがどのようになっているのかを調べることができます。
book = Book.first # status を確認. book.status => "sell" # status は soldoutかを確認 book.soldout? # => false # status をsoldout に変更! book.soldout! # status の取る値を確認. Book.statuses => {"sell"=>0, "sale"=>1, "soldout"=>2}
また、enumをActiveRecordで使うのなら、gemがあります。
他に奥深い話をしていたのですが、enumの存在を知らなかったので、もっと知識を得て、アウトプットしなければ・・・
勉強会に参加することで、自分では知らないことが聞け、視点が広がるので助かりますね。