enumについて

sendagaya.rbに参加させていただきました。

ActiveRecordenumという型を使っているかというお話になりました。

自分はenum自体全く馴染みがなかったので、調べてみました。

C+をやっている方には馴染みがあるようですね。

参考: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}

また、enumActiveRecordで使うのなら、gemがあります。

github.com

他に奥深い話をしていたのですが、enumの存在を知らなかったので、もっと知識を得て、アウトプットしなければ・・・

勉強会に参加することで、自分では知らないことが聞け、視点が広がるので助かりますね。