删除与用户ID关联的记录

时间:2015-12-30 09:24:16

标签: ruby-on-rails

我在rails / angular应用程序中创建了一个简单的友谊功能,但是我在使用destroy功能时遇到了一些麻烦。我想到了一个解决方案,但不确定它是否会起作用,以及如何创建它。

当创建友谊时,新记录(友谊)存储在友谊表中,

  create_table "friendships", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "friend_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

这里是友谊的json输出。 id是友谊的id,friend_id是用户的id。\ / p>

{"id":8,"friend_id":2},
{"id":9,"friend_id":3},
{"id":10,"friend_id":4}

在我的友谊控制器中,我有这个,

def index
  friends = current_user.friends.as_json(:only => [:id, :friend_id, :name])
  render :json => friends
end

其中包含以下内容。

{"id":2,"name":"Jan Jansen"},
{"id":3,"name":"Kees Keesen"},
{"id":4,"name":"Piet Pietersen"}

正如您所看到的,用户的ID与友谊中的friend_id一致。

现在问题。这是我的删除功能,

def destroy
  @friendship = current_user.friendships.find params[:id]
  @friendship.destroy
  redirect_to root_url
end

这里的问题是传递的id是用户的id而不是id友谊。所以,如果我现在删除友谊,我会收到错误。

  

http://localhost:3000/friendships/4.json 404(未找到)

用户ID,friend_id和友情ID之间存在链接。是否可以通过用户ID和/或friend_id获取友谊ID?

2 个答案:

答案 0 :(得分:2)

  

是否可以通过用户ID和/或friend_id获取友情ID?

我认为你的模式是错误的。

您正试图找到联接表的id;您应该寻找的是friend_id

def destroy
  @friendship = current_user.friendships.find_by friend_id: params[:id]
  @friendship.destroy
  redirect_to root_url
end

这样 - 如果您将friend_id传递给destroy方法,它会找到current_user朋友

#app/views/friendships/index.html.erb
<%= current_user.friends.each do |friend| %>
   <%= link_to "Unfriend", user_friendships_path(friend), method: :destroy %>
<% end %>

<强>更新

如果您可以通过其friendship查找id,则可能会使用has_many :through关联:

enter image description here

从上面的schema可以看出,HMT join tables有一个 primary key ,您正试图查看find 1}}。问题是这个主键与它引用的其他表完全没有 no 的关系。

由于您正在尝试识别与friendship相关的current_user记录,因此我认为您正在尝试识别特定的friend。唯一的方法是查看friend_id列。

如果你有has_and_belongs_to_many(上面表格的简单实现),你就可以使用:

 current_user.friendships.find params[:id]

...因为这直接链接到另一个表(不是连接)。

答案 1 :(得分:1)

似乎您只想删除友情,因此friend_id为用户找到它。

current_user.friendships.where(friend_id: params[:friend_id]).first

所以

  

http://localhost:3000/friendships/4.json

将匹配当前用户的路由:friendships/:friend_id