gpt4 book ai didi

ruby-on-rails - 拥有并属于许多 API 更新

转载 作者:行者123 更新时间:2023-12-04 13:36:10 26 4
gpt4 key购买 nike

我有一个 has_and_belongs_to_many在我的 Rails 项目中。架构看起来像这样

    create_table :dogs do |t|
t.string :name
t.string :breed
t.string :dog_type
end

create_table :users_dogs, id: false do |t|
t.belongs_to :user
t.belongs_to :dog
t.index ["user_id", "dog_id"], name: "by_user_and_dog", unique: true
t.index ["user_id"], name: "index_users_dogs_on_user_id"
t.index ["dog_id"], name: "index_users_dogs_on_dog_id"
end

create_table :users do |t|
t.string :name
t.string :email
end

还有我的模特
class User < ApplicationRecord
has_and_belongs_to_many :dogs

validate :only_one_good_dog_per_breed
validate :only_one_bad_dog_per_breed
validate :at_least_one_good_dog
end

class Dogs < ApplicationRecord
DOG_TYPES = %w[good bad].freeze
BREEDS = %w[poodle bulldog]
has_and_belongs_to_many :users

validates :name, :breed, :dog_type, presence: true
validates :breed,
inclusion: { in: BREEDS, allowed_options: BREEDS.join(", ") }
validates :dog_type,
inclusion: { in: DOG_TYPES, allowed_options: DOG_TYPES.join(", ") }
validates :name, uniqueness: { scope: [:breed, :dog_type] }
end

如您所见,用户可以拥有的狗类型有一些限制。每个品种只能有 1 个 dog_type。名字可以是任何东西。而且他们必须始终拥有至少 1 只好狗。

好的,现在我的问题。我的 API 客户端有一个更新用户 API 路由。目前,他们可以发送他们的狗 ID 作为用户参数的一部分来更新他们的狗。
    def update
if @user.update(user_params)
render json: @user, status: :ok
else
render json: { errors: @user.errors }, status: :unprocessable_entity
end
end

private

def user_params
params.require(:user).permit(
:name,
dog_ids: []
)
end


现在我意识到我的 API 客户端必须始终发送所有用户狗 ID,如果他们想要执行以下任何操作,更新他们的狗的名字,将新创建的狗对象添加到用户拥有的狗列表中,或从属于用户的狗列表中删除一条狗。

截至目前,我的 API 仅允许创建 Dog 对象。由于这些狗可以拥有并属于许多不同的用户,我不想允许直接更新或删除狗,因为这可能会影响我共享狗的其他用户,而他们的狗根本没有改变。

我想知道是否应该继续要求我的 API 客户端始终发送将与我的用户关联的所有 dog_id。或者,如果我应该在我的用户 API Controller 中创建三个操作。将一只狗添加到用户的狗列表中。一个更新用户现有的狗(即,将新的 dog_id 与用户相关联,并根据我的验证删除共享新狗的品种和 dog_type 的现有狗 id)。还有一个从用户狗列表中删除狗的操作。

对于 has_and_belongs_to_many 类型的关系,这些类型的 API 的典型特征是什么?

最佳答案

我不确定这种关系的典型 API 是什么。对该主题的快速谷歌没有发现任何明确的信息。

然而,需要注意的一件事是,这不是在经典的 CRUD 意义上管理资源。它管理资源之间的关联。

我想狗将使用传统的狗端点进行管理。例如创建一个新狗:

POST/api/v1/dogs
PARAMS:
- name
- breed
- dog_type

然后要创建或删除关联,API 客户端将向这些端点发出请求:
POST /api/v1/users/:user_id/dogs/:id

DELETE /api/v1/users/:user_id/dogs/:id

将对这些请求强制执行与用户相关的验证。

关于ruby-on-rails - 拥有并属于许多 API 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61902122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com