2016-04-07 12 views
1

なしのスーパーユーザー:AASMルビー宝石:<strong>AASM</strong>宝石を使用して次のモデルを考えると制限

class Job 
    include AASM 

    aasm do 
    state :sleeping, :initial => true 
    state :running, :cleaning 

    event :run do 
     transitions :from => :sleeping, :to => :running 
    end 

    event :clean do 
     transitions :from => :running, :to => :cleaning 
    end 

    event :sleep do 
     transitions :from => [:running, :cleaning], :to => :sleeping 
    end 
    end 
end 

私は自分のWebアプリケーション上のユーザ(一般ユーザ、およびスーパーユーザ)の2種類があります。私は彼らが望むイベントを呼び出すことができるbeeing、スーパーユーザーのタイプが必要です。 state = cleaningのジョブで#runを呼び出すのと同じです。

私が必要とするのは、実行時に遷移のから解決することです。ユーザーがスーパーユーザーの場合、からまでがすべての状態になりますが、ユーザーがスーパーユーザーでない場合は、それぞれが異なる状態になります。

これを行うためのクリーンな方法はありますか?あなたはなにか考えはありますか? current_userに基づくモデル層で意思決定を行う

答えて

0

は常にコードのにおいが検討されているので、あなたの目標を達成するために、きれいないくつかの方法は次のようになります。

  1. いくつかの継承を実装するには、のように:

    CommonUserJob < Job 
        # move your current AASM validations here 
    end 
    
    AdminJob < Job 
        aasm do 
        event :run do 
         all_states = Job.aasm.states.map{|i| i.name} 
         transitions :from => all_states, :to => :running 
        end 
        # other events here in same manner 
        end 
    end  
    

    次に、ユーザーの役割に基づいてCommonUserJobまたはAdminJobインスタンスを取得し、状態を変更する必要があります。

  2. は、あなたがモジュールに自分の役割固有aasmコードを移動し、実行時に特定のものでjobオブジェクトを拡張意味するであろういくつかの組成を(composition over inheritance参照)、実装するには。この提案の両方がまったくaasm検証せずにお使いのベースJobクラスを残す

注意。これは一般的なRailsの方法と矛盾しているようですが、DCI paradigmに従っています。これは、システムが何であるか(ドメインモデル)とシステムの機能(機能)を切り離すべきだと述べています。基本クラスのインスタンスは、現在の状態を引き続き取得する必要があります。

関連する問題