我有一个Job
模型belongs_to
三个用户(客户,员工和qa)。创建作业时,客户设置为current_user
,但员工和qa用户从无人认领的作业池中选择作业。
我目前实现此方法的方式如下:match 'jobs/:id/assign/:type/:user_id' => 'jobs#assign'
,assign
方法,params[:type]
上有一个案例陈述。因此,例如,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'
答案 0 :(得分:1)
您可能会考虑采用更加RESTful的方法解决您的问题。 RESTful Best Practices引用“经典初学者错误”的两件事是“强烈反映您的ActiveRecord数据模型以选择您的资源”,并且“如果标准的方法不合适,则添加自定义方法。”
名词 是新动词
- 改变解释场景的方式,一个动作
- 使用名词来描述行动
- 为您的方案提供的名词您正在寻找的资源
- 用户订阅到 - &gt; <订阅
- 该项目验证 - &gt; 项目验证已创建
- 用户停用他的帐户 - &gt; 用户帐户激活已删除
您可以轻松创建“作业分配”资源(不必然是单独的模型),例如,create
具有正确参数的资源。在粗糙的伪Rails中:
# 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开始)。
答案 1 :(得分:0)
我认为解决这个问题的好方法是首先设计你的路线,这就是你正在做的事情。
如果事先知道“工作”和受让人,您当前的路线很好。在我看来,如果你填写工作和受让人类型信息在你做的太多的路线。
员工/ 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没有登录,请告诉我,我会用其他解决方案相应地更新解决方案。