2011-05-17 88 views
0

我有一個Job模型,belongs_to三個用戶(客戶,員工和qa)。創建工作時,客戶被設置爲current_user,但員工和qa用戶從無人認領的工作池中選擇工作。這些路線的最佳做法是什麼?

我現在執行此操作的方式如下:match 'jobs/:id/assign/:type/:user_id' => 'jobs#assign'assign方法與params[:type]上的case語句。因此,例如,jobs/1/assign/qa/1將用戶1分配給作業1的qa。

這可行,但似乎馬虎,我想用更乾淨的東西替換它。這種情況是否有共同的慣例?

編輯:用戶可以同時擁有員工和qa角色。這就是讓我感覺如此複雜的路線。

class User < ActiveRecord::Base 
    has_many :submitted_jobs, :class_name => 'Job', :foreign_key => 'customer_id' 
    has_many :assigned_jobs, :class_name => 'Job', :foreign_key => 'employee_id' 
    has_many :reviewed_jobs, :class_name => 'Job', :foreign_key => 'qa_id' 

class Job < ActiveRecord::Base 
    belongs_to :customer, :class_name => 'User', :foreign_key => 'customer_id' 
    belongs_to :employee, :class_name => 'User', :foreign_key => 'employee_id' 
    belongs_to :qa,  :class_name => 'User', :foreign_key => 'qa_id' 

回答

1

您可能會考慮針對您的問題採用更具REST風格的方法。 RESTful Best Practices引用「經典初學者的錯誤」中的兩個是「強烈反映你的ActiveRecord數據模型以選擇你的資源」,並且「如果標準的方法不適合,添加自定義方法。「

名詞是新的動詞

  • 改變你的解釋的情況下,動作
    • 使用名詞來形容行動
    • 名詞的方式給你的場景你正在尋找的資源
  • 預訂一組的用戶 - >訂閱創建
  • 該項目由其所有者驗證- >項目驗證創建
  • 用戶停用他的賬戶- > A 用戶帳戶激活被刪除

你可以很容易地創建一個「作業分配」資源(一定是單獨的模型),例如,一個create用正確的參數。在粗僞軌中:

# routes 
resources :job_assignments, :only => [:create, :delete] # or whatever you need 

# job_assignments_controller 
class JobAssignmentsController < ApplicationController 
    def create 
    user = User.find(params[:user_id]) 
    job = Job.find(params[:job_id]) 
    user.assign(job, params[:job_type]) # handle model logic 
    end 

    def destroy 
    user = User.find(params[:user_id]) 
    job = Job.find(params[:job_id]) 
    user.unassign(job, params[:job_type]) # handle model logic 
    end 
end 

演示文稿中有一些很好的例子(從幻燈片32開始)。

+0

我有一種感覺,有一個更好的方法。這正是我正在尋找的。謝謝! – Luke 2011-05-17 05:55:48

0

我認爲解決這個問題的一個好方法是首先設計你的路線,這就是你正在做的。

如果「Job」和受讓人事先已知,那麼您的當前路由很棒。在我看來,如果你把工作和受讓人類型信息填入路線中,那麼你做得太多了。

員工/ qa是否也登錄並選擇自己的工作?如果他們這樣做,那麼他們自己的信息將在「current_user」中在服務器端可用。

在這種情況下,理想情況下,路由應該以「/ job /:id/pick」爲例,通過POST請求發送到「JobsController#pick」動作。在您的控制器操作中,您將獲得current_user中的eemployee/qa用戶信息。

config/routes.rb 

resource :jobs do 
    member do 
    post :pick 
    end 
end 

in app/controller/jobs_controller.rb 

def pick 
    job = Job.find(params[:id]) 
    current_user.jobs << job # User has_many :jobs 
    # or 
    job.user = current_user 
    ... 
end 

請讓我知道,如果員工/ qa不登錄,我會用另一種解決方案相應地更新解決方案。

+0

我同意我在路線中填入太多參數,但情況稍微複雜一點,因爲用戶可以同時擁有員工和qa角色。因此,我無法區分路線本身的兩種作業。 – Luke 2011-05-17 03:01:00

+0

不用擔心。那麼用戶如何選擇一項工作分配?點擊兩個按鈕中的一個'Pick as Employee','選擇QA'作爲每個無人認領的工作?從下拉菜單中選擇一些內容? – 2011-05-17 03:06:59

+0

根據用戶的角色,將有許多表格視圖可供用戶使用。例如,只有員工的用戶才能看到沒有員工分配給他們的工作表。具有qa角色的用戶將能夠看到具有需要審查的作業的另一個表。具有這兩個角色的用戶將可以訪問這兩個表。工作必須完成才能被審查,因此只有一個按鈕才能根據其上下文選擇工作。 – Luke 2011-05-17 03:14:41

相關問題