我有一个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'
您可能会考虑使用更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开始)。
我认为解决此问题的好方法是首先设计路线,这就是您正在做的事情。
如果“工作”和受让人事先知道,那么您当前的路由就很好。 我认为,如果您将工作和受让人类型信息塞在路线中,则说明您做得太多。
员工/质量检查人员是否也登录并选择自己的工作? 如果他们这样做,那么他们自己的信息将在服务器端的“ 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
请让我知道员工/质量检查员是否不登录,我将相应地用另一种解决方案更新解决方案。