Rails,如何阻止它从数据库中删除项目?

时间:2014-05-21 10:26:53

标签: ruby-on-rails

我目前有一个应用程序,允许用户将节目添加到他们的帐户。为此,我有一个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

正如您可能看到的那样,它会完全删除数据库中的节目,并且不会从该用户中删除它。我如何改变这一点以避免这种情况发生?

2 个答案:

答案 0 :(得分:1)

对于has_many through关系,破坏关系的最简单方法是:

 current_user.user_shows.find_by(:show_id => params[:id]).destroy

所以基本上,找到连接表中的链接,并销毁它。

答案 1 :(得分:1)

您正在销毁Show,而不是UserShowUserShow)之间的关系。尝试这样的事情:

def remove_show
    current_user.user_shows.where(show: params[:id]).destroy_all
    redirect_to my_shows_path
    flash[:notice] = "Show removed"
end