StartupTechnology開発部による技術ブログ

StartupTechnologyの開発部が
開発の裏側やノウハウをお届けします。

enumのネガティブバージョンを定義してみた

投稿者
willian

こんにちは!日本語が少しできるブラジル人です!

早速ですが、複数条件を書くときにenumに対して否定演算子を使った事ありますか?

ちなみに僕は複数条件を書くときに否定演算子を使用するのはあまり好きじゃないです。。

こんなunless文をみたときには、もうブラジルに帰って農家に転職したくなってしまいます。。

unless !user.present? && !user.done? && !user.is_pokemon?
  # some code
end

なので、今回は少しでも理解がしやすいように、enumのネガティブバージョンを定義してみようと思いますー!


実装

早速ネガティブバージョンのメソッドを定義してみる

class User

  enum status: {
    pending: 0,
    done: 1,
    canceled: 2
  }
  
  def not_pending?
    !pending?
  end
  
  def not_done?
    !done?
  end
  
  def not_canceled?
    !canceled?
  end
end

> user = User.new(status: :pending)
> user.present? && user.not_done?
> true

↑の方法だと、今後ステータスが増えたときに毎回ネガティブバージョンを定義するのに手間がかかるから、define_methodでenumのネガティブバージョンを定義してUserクラス内をスッキリさせる

class User

  enum status: {
    pending: 0,
    done: 1,
    canceled: 2
  }
  
  self.statuses.each_key do |enum_name|
    define_method("not_#{enum_name}?") do
      !send("#{enum_name}?")
    end
  end
end

> user = User.new(status: :pending)
> user.present? && user.not_done?
> true

完了!!

これで否定演算子まみれの条件を見なくて済みますね!やったね!!

一緒にスタートアップを盛り上げませんか?
Rails + GitHub Actionsではまったこと
2020/02/14
NOT NULL制約追加時のinvalid use of NULL valueを解消する
2020/03/27