在Rails 3中将实体添加到另一个实体(n:m关系)的RESTful方法?

| 这可能是一个非常简单的问题,有一个简单的解决方案,但是我还没有得到。 假设我有以下两个模型:
class Task
   has_and_belongs_to_many :users
end

class User
   has_and_belongs_to_many :tasks
end
进一步假设有一个名为\“ wayne \”的用户,其ID为1,还有一个名为\“ GO Shopping \”的任务,其ID为2。通过REST接口在它们之间建立关系的RESTful方法是什么? 添加诸如users / 1 / add_task / 2之类的路由更像是RPC样式,并且不是非常RESTful的。那你该怎么做呢?     
已邀请:
        宁静的方法是添加一个用作连接的模型。然后,联合对象将获得自己的资源。 连接模型可以被称为例如订阅,或者,如果找不到合适的名称,则将其命名为TaskUser。 Rails指南的这一部分是相关的: http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
class Task
  has_many :users, :through => \"TaskUser\"
end

class User
  has_many :tasks, :through => \"TaskUser\"
end

class TaskUser
  has_many :users
  has_many :tasks
end
在声明路由后提交带有
user_id
和ѭ4a的
POST to /taskusers
(例如,通过在route.rb中添加
resource TaskUser
),您将在两个对象之间创建链接。控制器应包含以下内容:
class TaskUsersController
  def create
    TaskUser.create(:task_id => params[:task_id], :user_id => params[:user_id])
  end
end
然后,您只需调用即可访问用户的任务
user.tasks
就我个人而言,我认为在某些情况下您不需要此解决方案,因为它会给附加模型和所有其他方面造成相当大的开销。 例如,我有一个Item模型,并想为其添加标签。这是每个模型中由
has_and_belongs_to_many
声明的多对多关联,但是我总是向项目添加标签,而不是相反地添加标签,因此前一种解决方案似乎有点多。然后我只添加
put \"/Items/#{item_id}/tags/#{tag_id}\" => \"items#add_tag\"
到routes.rb。 ItemController:
class ItemController
  def add_tag
    item = Item.find_by_id(:item_id)
    tag = Tag.find_by_id(:tag_id)
    item.tags << tag
    item.save
  end
end
希望这对您有任何帮助,即使我刚刚看到答案迟了一年。     
        你可以去 用户/ {userid} /任务/ 该位置的PUT将带有{taskid}的任务添加到集合中;您也可以(同时)拥有 任务/ {taskid} /用户/ 其中该位置的PUT将具有{userid}的用户添加到集合中。     
        您对此解决方案有何看法? 编辑:此示例将User用AssignmentSheet替换为Task和Assignment的任务以适合原始问题。 一些路线:
# routes.rb
put \"assignment_usage/assignment_sheet/:assignment_sheet_id/assignment/:assignment_id\" => \"assignment_usage#create\"
  delete \"assignment_usage/assignment_sheet/:assignment_sheet_id/assignment/:assignment_id\" => \"assignment_usage#destroy\"
和控制器代码:
# app/controllers/assignment_usage_controller.rb
class AssignmentUsageController < ApplicationController
  before_filter :load_instances

  # PUT /assignment_usage/assignment_sheet/:assignment_sheet_id/assignment/:assignment_id
  def create
    @assignment.assignment_sheets << @assignment_sheet
    redirect_to(@assignment_sheet, :notice => \"Assignment has been successfully added.\")
  end

  # DELETE /assignment_usage/assignment_sheet/:assignment_sheet_id/assignment/:assignment_id
  def destroy
    @assignment.assignment_sheets.delete @assignment_sheet
    redirect_to(@assignment_sheet, :notice => \"Assignment has been successfully removed.\")
  end

  private
  def load_instances
    @assignment_sheet = AssignmentSheet.find(params[:assignment_sheet_id])
    @assignment       = Assignment.find(params[:assignment_id])
  end
end
也许为此使用单独的资源会更清楚一点。     

要回复问题请先登录注册