通过一个请求REST多次设计与DELETE的多对多关系

时间:2012-06-01 17:15:45

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

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

如果我有一个用户< = Friendships =>朋友多对多的关系,我应该满意的是,为了删除任何用户的友谊,我首先要查询GET友谊#index以获取我打算删除的友谊的ID,然后发出删除请求?

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

为了让用户删除友谊,应用程序需要具有友谊“id”,但为了让用户知道他们正在删除哪个朋友,他们需要看到朋友“名字”。< / p>

换句话说,是否有一种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

1 个答案:

答案 0 :(得分:1)

我认为您不需要发出两个单独的请求。我想如果你处在一个只知道user_id和follower_id的位置,你可以在友谊模型中实现一个查找器,找到基于user_id和friend_id的友谊,然后删除找到的友谊。虽然,我认为如果你想以纯粹的宁静方式去,最好在展示友谊关系时拉出friendship.id服务器端。在Rails Tutorial codebase for sample_app中有一个很好的例子。这里,连接模型称为关系,并且RelationshipsController具有create和destroy操作。处理销毁操作的表单可在/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 %>

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