rails:判定ロジックサンプル備忘1

以下のようなケースの判定ロジックを考える。
モデルで以下のように定数定義。
app/models/worker.rb

class Worker < ApplicationRecord
  WORKER_TYPES = { TEACHER: 1, PILOT: 2 }.each_value(&:freeze).freeze
end

デコレータは以下のように継承して定義。
app/decorators/

class WorkerDecorator < ApplicationDecorator
end

class TeacherDecorator < WorkerDecorator
end

class PilotDecorator < WorkerDecorator
end

ロジックでは以下のように判定して利用する。

decorate_worker = 
  if params[:worker_type] == Worker::WORKER_TYPES[:TEACHER].to_s
    TeacherDecorator.decorate(worker)
  else
    PilotDecorator.decorate(worker)
  end
puts decorate_worker.abillity

上記を、メソッド化して、以下のように整理。
メソッドからは、クラスを返却している。

decorate_worker = worker_decorator(params[:worker_type]).decorate(worker)
puts decorate_worker.abillity

def teacher?(worker_type)
  worker_type == Worker::WORKER_TYPES[:TEACHER].to_s
end

def pilot?(worker_type)
  !teacher?(worker_type)
end

def worker_decorator(worker_type)
  # classを返却
  teacher?(worker_type) ? TeacherDecorator : PilotDecorator
end

メソッド化しないのであれば、省略記述できるが、可読性は下がる。
以下、記述例。

# ex1
decorator = params[:worker_type] == Worker::WORKER_TYPES[:TEACHER].to_s ? TeacherDecorator : PilotDecorator
decorate_worker = decorator.decorate(worker)

# ex2
decorator = params[:worker_type] == Worker::WORKER_TYPES[:TEACHER].to_s ? TeacherDecorator : PilotDecorator
decorate_worker = decorator.decorate(worker)

# ex3
decorate_worker = decorator(params[:worker_type]).decorate(worker)

def decorator(worker_type)
  worker_type == Worker::WORKER_TYPES[:TEACHER].to_s ? TeacherDecorator : PilotDecorator
end