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