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

标签 ruby-on-rails has-and-belongs-to-many

我有一个 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/

相关文章:

ruby-on-rails - ActiveRecord 究竟如何期望日期被格式化

ruby-on-rails - 如何在 Rails 中使用模型关注点

php - CakePHP 在不破坏 Cake 自动化的情况下自行加入 HABTM 表

ruby-on-rails - Rails - 如何在 "Shops"和 "Malls"之间分配 has_and_belongs_to_many (在 Controller 和表单 View 中)

ruby-on-rails-3 - 带有 SQLite3::SQLException 的 Rails3:没有这样的列 HABTM

mysql - 我的 CakePHP HABTM 查询出了什么问题?

ruby-on-rails - 如何在 simple_form 中使用占位符而不是标签?

ruby-on-rails - Rails 路由 : redirect an entire resource

ruby-on-rails - 如何在 Rails 中异步执行 Controller.destroy 操作?

ruby-on-rails - Rails has_and_belongs_to_many 总是插入到数据库中