我在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友谊。所以,如果我现在删除友谊,我会收到错误。
用户ID,friend_id和友情ID之间存在链接。是否可以通过用户ID和/或friend_id获取友谊ID?
答案 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
关联:
从上面的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
所以
将匹配当前用户的路由:friendships/:friend_id