Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ActiveRecord::Enumのススメ

2,477 views

Published on

第100回 okayama.rb での発表資料です。
ActiveRecord::Enum便利だよって話。

Published in: Software
  • Be the first to comment

ActiveRecord::Enumのススメ

  1. 1. ActiveRecord::Enum のススメ 2015-08-22 @patorash 第100回 Okayama.rb #okaruby
  2. 2. 自己紹介 名前:尾古 豊明 所属:株式会社リゾーム(岡山) TwitterID:@patorash 鳥取県大山町(旧中山町)出身。 米子東高校卒業後、愛媛大学に進学。松山で就職。 NWしてたけど25歳でPHPプログラマに強制転向。 独自フレームワーク、CakePHP、WordPressなどを経て Androidやって、1年個人事業主やって、チーム開発がしたくな りリゾームに入社。RubyとRailsを覚える。
  3. 3. ActiveRecord::Enumとは? ● Rails4.1から追加されたModelで使える機能 ● 列挙型を透過的に使うことができる ● その他、便利な機能が目白押し
  4. 4. class Article < ActiveRecord::Base enum status: [:draft, :published, :closed] end articlesテーブルにstatusというInt型のカラムが ある場合に使える。 何も指定しない場合は、先頭から順に0,1,2,... という値が自動的に付く。 これには罠があって、:draft, :publishedの間に 後で:reservedなどを新たに作った場合、今ま で:publishedが1だったのに、 なんと:reservedが1になってしまう。
  5. 5. class Article < ActiveRecord::Base enum status: { draft: 1, published:2, closed: 3 } end enumの値にHashを使えば、 任意の値を定義可能になる。 さきほどの、reservedを途中で加える場合など はこちらを使えば対応可能になる。
  6. 6. 便利機能その1:Scopeの自動付加 ● Article.draft ● Article.published ● Article.closed のように、scopeを使える。 Article.where(status: 1)としなくてもいい。 なお、Article.where(status: :draft)はできない… Article.where(status: Article.statuses[:draft])とな る。
  7. 7. 便利機能その2:文字で指定可能 article = Article.new(status: :draft) が可能になる。 どの数値がどのステータスを表していたかを覚え ていなくてもよい。 ならwhereでも使えたらいいのにね…。
  8. 8. 便利機能その3:確認メソッド article = Article.find 1 #公開済みの記事 article.published? # => true article.draft? # => false article.closed? # => false 確認メソッドが自動生成される。
  9. 9. 便利機能その4:更新メソッド article = Article.find 1 #公開済みの記事 article.closed! # 非公開に変更 更新メソッドが定義される
  10. 10. 便利機能その5:enum取得メソッド Article.statuses # => { “draft” => 0, “published” => 1, “closed” => 2 } 複数形にすれば定義のハッシュが取得可能。
  11. 11. 足りない機能もある… gem enum_helpを使おう!
  12. 12. enum_helpとは? Viewのことを考慮した機能を追加してくれる ● 国際化対応(I18N) ● config/locales/enums.ja.ymlを定義 ja: enums: article: status: draft: 下書き published: 公開済み closed: 非公開
  13. 13. enum_helpの便利機能その1 article = Article.find 1 #公開済みの記事 article.status # “published” article.status_i18n # “公開済み”
  14. 14. enum_helpの便利機能その2 Article.statuses_i18n # => { “draft” => “下書き”, “published” => “公開済み”, “closed” => “非公開” }

×