2016-04-07 61 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 

我有2種在我的Web應用用戶(普通用戶和超級用戶)。我需要超級用戶類型,可以打電話給他們想要的事件。就像在state = cleaning的工作上調用#run一樣。

所以,據我所知,我需要的是在運行時從解決轉換的。如果用戶是超級用戶,則從開始的將是所有狀態,但是如果用戶不是超級用戶,則每個來自不同的狀態。

有沒有乾淨的方法可以做到這一點?你有什麼想法?

回答

0

基於current_user模型層做出決策一直被認爲是一個代碼味道,所以幾個乾淨的方式來實現你的目標可能是:

  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  
    

    然後,您應根據用戶的角色獲取CommonUserJobAdminJob實例並調用狀態更改。

  2. 實現一些成分(指composition over inheritance),這意味着您的特定角色aasm代碼移到模塊,並在運行時一個特定擴展job對象。

注意兩者的這個建議,在所有離開你的基地Job類沒有任何aasm驗證。這似乎與通用的Rails方式相矛盾,但遵循DCI paradigm,該規定聲明我們應該將系統(域模型)與系統所做的功能(功能)分開。儘管基類實例仍然能夠獲得其當前狀態。