破いて捨てたノート

Webやテクノロジーやそれ以外に関する思いつき

列挙型の値を保存するときはintegerで保存しとけActiveRecord::Enum

列挙型とは、有限集合として持つ抽象データのことで例えばstatusなんかがそうです。 stasus: [:active, :archived] みたいなやつ。

例えば、Conversationクラスにstatusカラム(active, archived)を持っている場合を考えてみましょう。 主な保存方法としては2パターンあります。

  1. stringで保存('active'とか'archived'を文字列のまま保存)
  2. integerで保存({ active: 0, archived: 1 }の対応をどこかで保持し、DBには数字のみを保存)

一長一短ありますが、Railsでは今後、2の方を推奨していくようですね。(一般的に、1はバッドパターンらしいですね。何となくわかりますがきちんと理解してない。。

http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

# conversation.update! status: 0
conversation.active!
conversation.active? # => true
conversation.status  # => "active"

# conversation.update! status: 1
conversation.archived!
conversation.archived? # => true
conversation.status    # => "archived"

# conversation.update! status: 1
conversation.status = "archived"

# conversation.update! status: nil
conversation.status = nil
conversation.status.nil? # => true
conversation.status      # => nil

こんなような感じで使えるみたいです。 詳しくはAPIを読みましょう。

http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

Crafting Rails 4 Applications: Expert Practices for Everyday Rails Development

Crafting Rails 4 Applications: Expert Practices for Everyday Rails Development