2013-04-20 4 views
0

У меня есть Rails модель под названием проекты:Как расширить пользовательский метод рельсов?

class Project < ActiveRecord::Base 

, который имеет множество переключателей, такие как активные, начал, платный и т.д.

Я тогда способ, чтобы вернуть статус человека читаемый формат:

def status 
    return 'Pending' if self.pending? 
    return 'Started' if self.started 
    return 'In Review' if self.in_review? 
    return 'Approved' if self.approved 
    return 'Active' if self.active 
end 

Сейчас у меня есть еще один метод, который называется status!, который возвращает ту же информацию, но и в виде символа, который является неэффективным в моем сознании:

def status 
    return :pending if self.pending? 
    return :started if self.started 
    return :awarded if self.awarded 
    return :in_review if self.in_review? 
    return :approved if self.approved 
    return :active if self.active 
end 

То, что я хотел бы сделать, это нечто большее, чем status.to_sym, но не может понять, как это осуществить.

Любые мысли?

+1

Похоже, что он может быть реализован как [конечный автомат] (https://github.com/troessner/transitions). – Stefan

+0

Если эти статусы являются взаимоисключающими, почему бы не иметь одно поле «статус» и не использовать ли ваше представление группу переключателей или поле выбора для установки статуса? –

ответ

1

Как об этом:

def status 
    return 'Pending' if self.pending? 
    return 'Started' if self.started 
    return 'In Review' if self.in_review? 
    return 'Approved' if self.approved 
    return 'Active' if self.active 
end 

def status! 
    # added gsub otherwise 'In Review' is returned as ':in review' 
    status.gsub(/\s+/, "_").downcase.to_sym 
    # status.parameterize.underscore.to_sym <- another option, Rails only 
end 
0

В первом я очень двойные эти методы являются эффективными.

Эти методы предназначены для определения определенного состояния при рабочем процессе. В общем, они взаимоисключающие. То есть проект «в ожидании» не может быть «активным» проектом или «в обзоре» или любым другим статусом в этой группе.

На основании вышеизложенного, почему бы вам не установить все эти статусы как атрибут Enum «status» в этой модели? Это значение атрибута может быть любым из «ожидающих, активных, запущенных ...» При этом вы используете одно поле для замены 5 полей.

Тогда легко получить статус в человекообразном формате прямо в представлении, даже без метода контроллера.

<strong>Status: </strong><%= @project.status.titleize %>