我目前有一个应用程序,允许用户将节目添加到他们的帐户。为此,我有一个User,show和user_show模型并将它们关联如下:
# User.rb:
has_many: user_show
has_many: shows, through: :user_shows
# Show.rb
has_many :user_shows
has_many :users, through: :user_shows
# User_show.rb
belongs_to: user
belongs_to: show
目前在我的用户控制器中,我有这个用于添加和删除:
class UsersController < ApplicationController
def add_show
show = Show.find params[:id]
current_user.shows << show
redirect_to my_shows_path
flash[:notice] = "Show added"
end
def remove_show
show = Show.find(params[:id]).destroy
redirect_to my_shows_path
flash[:notice] = "Show removed"
end
end
和我这样的路线:
resources :users, except: :show do
collection do
get "add_show/:id", action: :add_show, as: "add_show"
delete "remove_show/:id", action: :remove_show, as: "remove_show" #-> should create /users/add_show, considering you have current_user
end
end
正如您可能看到的那样,它会完全删除数据库中的节目,并且不会从该用户中删除它。我如何改变这一点以避免这种情况发生?
答案 0 :(得分:1)
对于has_many through关系,破坏关系的最简单方法是:
current_user.user_shows.find_by(:show_id => params[:id]).destroy
所以基本上,找到连接表中的链接,并销毁它。
答案 1 :(得分:1)
您正在销毁Show
,而不是User
和Show
(UserShow
)之间的关系。尝试这样的事情:
def remove_show
current_user.user_shows.where(show: params[:id]).destroy_all
redirect_to my_shows_path
flash[:notice] = "Show removed"
end