Railsでenumを定義している時、自動でscopeが定義される

こんにちは!kossyです!




さて、今回はRailsenumを定義すると、自動でscopeが定義されるので、
その使い方についてブログに残してみたいと思います。




環境
Ruby 2.6.3
Rails 6.0.3
MacOS Mojave



使い方

例えば、Articleモデルがあって、

class Article
  enum status: [:published, :draft, :ignore]
end

のようにenumでstatusを定義しているとします。

このとき、「Articleのなかでstatusがdraftになっているレコードを抽出したい」とした場合、

Article.where(status: :draft)
=> #<ActiveRecord::Relation [#<Article id: 1, status: "draft"]

のように取得できますが、enumで定義している場合、

Article.draft
=> #<ActiveRecord::Relation [#<Article id: 1, status: "draft"]

とする事で、whereを使った時と同様の結果を得られるようになります。

where.notで取りたい場合も、

Article.not_draft

とするだけで取得することができます。

これは、enumを定義すると自動的にクラスに対してscopeが定義されるためです。
ActiveRecord::Enum


勉強になりました。