这些路线的最佳做法是什么?

问题描述 投票:0回答:2

我有一个Job模型, belongs_to三个用户(客户,员工和质量检查员)。 创建作业时将客户设置为current_user ,但是雇员和qa用户从无人认领的作业池中选择其作业。

我目前实现这种方式的方式如下: match 'jobs/:id/assign/:type/:user_id' => 'jobs#assign'与带有对params[:type]的case语句的assign方法match 'jobs/:id/assign/:type/:user_id' => 'jobs#assign' 。 因此,例如, jobs/1/assign/qa/1将用户1分配为作业1的质量保证。

这行得通,但似乎马虎,我想用更清洁的东西代替它。 对于这样的情况是否有通用约定?

编辑:用户可以同时具有雇员和质量保证角色。 这就是让我感到被逼入如此复杂路线的原因。

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'
ruby-on-rails
2个回答
1
投票

您可能会考虑使用更RESTful的方法来解决您的问题。 RESTful最佳实践称其为“经典初学者的错误”的两件事是“强烈地镜像您的ActiveRecord数据模型以选择您的资源”和“如果标准方法不合适,则添加自定义方法”。

名词 是新动词

  • 改变您对场景的解释方式
    • 使用名词来描述动作
    • 提供给您的方案的名词您正在寻找的资源
  • 用户订阅->创建订阅
  • 项目由其所有者验证 ->创建项目验证
  • 用户停用其帐户->删除用户帐户激活

你可以很容易地创建一个“作业分配”资源( 不一定是单独的模型),例如, 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
投票

我认为解决此问题的好方法是首先设计路线,这就是您正在做的事情。

如果“工作”和受让人事先知道,那么您当前的路由就很好。 我认为,如果您将工作和受让人类型信息塞在路线中,则说明您做得太多。

员工/质量检查人员是否也登录并选择自己的工作? 如果他们这样做,那么他们自己的信息将在服务器端的“ current_user”中可用。

在这种情况下,路由理想情况下应为“ / job /:id / pick”,例如通过POST请求转到“ JobsController#pick”操作。 在您的控制器操作中,您将在current_user中获得雇员/质量保证用户信息。

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

请让我知道员工/质量检查员是否不登录,我将相应地用另一种解决方案更新解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.