【问题标题】:RESTful design of many-to-many relationship to DELETE with one requestRESTful 设计多对多关系到 DELETE 一个请求
【发布时间】:2012-06-01 17:15:45
【问题描述】:

我正在创建一个 RESTful API,供 n+ 个客户端通过 HTTP 使用。

如果我有一个用户 Friends 多对多关系,我是否应该满足于为了删除用户的任何好友关系,我首先必须查询 GET Friendships#index 以获取 ID我打算删除的友谊,然后发出删除请求?

GET /friendships?user_id=123&friend_id=456
=> {id:"999",user_id:"123",friend_id:"456"}
DELETE /friendships/999
=> "Friendship deleted"

为了让用户删除好友,应用程序需要有好友“id”可用,但为了让用户知道他们正在删除哪个好友,他们需要查看好友“名称”。

换句话说,是否有一种 RESTful 方式在同一个 HTTP 请求中请求 Friend 模型数组及其各自的 Friendship 模型数组?

以下是我目前的设置:

# Models
class User < ActiveRecord::Base  
  has_many :friendships, :dependent => :destroy
  has_many :friends, :through => :friendships
  # disregard inverse for now
end

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User"
  validates_uniqueness_of :user_id, :scope => :friend_id
end


# Tables
create_table :users do |t|
  t.string :name
  t.timestamps
end

create_table :friendships do |t|
  t.integer :user_id, :null => false
  t.integer :friend_id, :null => false
  t.integer :status, :null => false, :default => 0
  t.timestamps
end

# routes.rb
resources :friendships, :only => [:create, :destroy, :index]
resources :users do
  member do
    get :friends # index-like action returning array of friends
  end
end

...是的,我一直在寻找几天:)

我正在使用 Rails,但这个问题适用于任何框架。是的,我知道我有一百万种方法可以“完成”,但我正在寻找 RESTful 方式来做到这一点,这样我就可以使用任何客户端框架,而不必过多地自定义 I/O .

【问题讨论】:

    标签: ruby-on-rails rest many-to-many


    【解决方案1】:

    我认为您不需要发出两个单独的请求。我认为,如果您处于只知道 user_id 和 follower_id 的位置,您可以在 Friendship 模型中实现一个查找器,以根据 user_id 和friend_id 查找友谊,然后删除找到的那个。不过,我认为如果您想走纯粹的宁静方式,最好在显示友谊关系时拉出friendship.id服务器端。在Rails Tutorial codebase for sample_app 中有一个很好的例子来说明如何做到这一点。在这里,连接模型称为关系,并且有一个具有创建和销毁操作的关系控制器。处理销毁操作的表单位于 /app/views/users/_unfollow.html.erb 中,如下所示:

    <%= form_for(current_user.relationships.find_by_followed_id(@user),
                 :html => { :method => :delete },
                 :remote => true) do |f| %>
      <div class="actions"><%= f.submit "Unfollow" %></div>
    <% end %>
    

    这里,用户模型上有一个 has_many :relationships,然后它使用 ActiveRecord 中的 find_by_followed_id 动态查找器返回要删除的特定关系对象。这似乎是最 RESTful 的方式。

    【讨论】:

    • 您好,感谢您的回复。我正在创建一个需要由各种客户端通过 HTTP 访问的 RESTful API。由于先前对用户的朋友列表(友谊)的索引调用,客户端已经具有“user_id”和“friend_id”。既然如此,我的问题是“user_id”和“friend_id”是否足以在 RESTful API 调用中用于删除友谊。
    • 哦,好的,我明白挂断了。我不认为使用 user_id 和friend_id,而不是friendship_id,是完全理想的(也不是完全平静的),但它确实有效。怎么拉好友ID?这是一个以 user_id 作为参数的 API 请求吗?如果是这样,我想知道您是否可以在该结果中包含friendship_id。
    • 在 GET /friends 中返回“friendship_id”以及每个 Friend 绝对是一个不错的选择。我想成为 REST 的忠实拥护者,但我想尽可能地遵守约定,这样客户就不必“定制”他们的代码来处理“几乎”的 RESTful API。
    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多