RESTful添加/删除has-many-through关联的方式

Mud*_*Ali 3 rest ruby-on-rails has-many-through ruby-on-rails-4

我有以下型号

class User < ActiveRecord::Base
  has_many :user_wishes
  has_many :wishes, through: :user_wishes
end
 
class UserWish < ActiveRecord::Base
  belongs_to :user
  belongs_to :wish
end
 
class Wish < ActiveRecord::Base
  has_many :user_wishes
  has_many :users, through: :user_wishes
end
Run Code Online (Sandbox Code Playgroud)

现在我有以下界面,用户可以在其中选择/取消选择愿望.

愿望清单

一旦用户完成选择/取消选择,他就提交表单.现在我在后端做的就是user_wishes为给定的user_id&创建或销毁记录wish_id.

现在有两种方法可以实现我能想到的解决方案.

1.通过计算现有和新愿望之间的差异

假设用户已经有N个愿望,现在他提出了M愿望的新请求.我将删除(N - M)的差异并添加(M - N)的差异.这种方法似乎非常低效,因为我总是必须通过网络发送(N∩M).

端点: /user_wishes
TYPE : POST ? 但它也删除了记录
参数: {wish_id: [1,2 ..], user_id: 10}

2.仅发送已更改的

我将在前端有逻辑,它给出了一个新添加/删除的愿望列表.

端点: /user_wishes
TYPE : POST ? 但它也删除了记录
参数: {added_wish_ids: [1,2 ..], removed_wish_ids: [12, 16], user_id: 10}

我现在正在使用这种方法,但这对我来说似乎并不开心!

我想知道最好的方法是什么.应该采用什么端点以及请求类型应该是什么?

eab*_*ham 5

添加/删除这些愿望的最宁静的方法可能是拥有一个带有单独POSTDELETE调用的嵌套api结构.

POST   /user/:user_id/wish/:wish_id
DELETE /user/:user_id/wish/:wish_id
Run Code Online (Sandbox Code Playgroud)

当用户检查/取消检查列表中的项目时,它将分别发送POST/DELETE.

class UserWishController < ApplicationController
  def create
    user_id = params[:user_id]
    wish_id = params[:wish_id]

    UserWish.create(user_id: user_id, wish_id: wish_id)
  end

  def destroy
    user_id = params[:user_id]
    wish_id = params[:wish_id]

    uw = UserWish.find(user_id: user_id, wish_id: wish_id)
    uw.destroy if uw.present?
  end
end
Run Code Online (Sandbox Code Playgroud)