删除多态关联

时间:2017-03-08 17:07:15

标签: ruby-on-rails ruby ruby-on-rails-3

我已按照this great article为我的rails应用程序实施了一个收藏系统。

这是我的设置:

favorite.rb

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :favorited, polymorphic: true
end

project.rb

class Project < ActiveRecord::Base
    belongs_to :user

    has_many :favorites, as: :favorited
    has_many :fans, through: :favorites, source: :user 

user.rb

class User < ActiveRecord::Base
  has_many :listings
  has_many :projects
  has_many :favorites
  has_many :favorite_listings, through: :favorites, source: :favorited, source_type: 'Listing'
  has_many :favorite_projects, through: :favorites, source: :favorited, source_type: 'Project'

favorite_projects_controller.rb

class FavoriteProjectsController < ApplicationController
  before_action :set_project
  # before_action :correct_user
  # before_action :authenticate_user!

  def create
    if Favorite.create(favorited: @project, user: current_user)
      redirect_to @project, notice: 'Project has been favorited'
    else
      redirect_to @project, alert: 'Something went wrong...*sad panda*'
    end
  end

  def destroy
    Favorite.where(favorited_id: @project.id, user_id: current_user.id).first.destroy
    redirect_to @project, notice: 'Project is no longer in favorites'
  end

  private

  def set_project
    @project = Project.find(params[:project_id] || params[:id])
  end
end

这是问题所在。

我有一些受欢迎的项目。

我使用Project.delete_all删除了我的项目,而某些项目仍然是&#34;收藏&#34;但现在我收到一个错误:

 ActionView::Template::Error (undefined method `favorite_projects' for nil:NilClass):

我确定如果我有&#34;不值得&#34;在删除之前所有这些项目都不会出现这个错误。

有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您需要设置相关选项。

has_many :favorites, as: :favorited, dependent: :destroy

在将数据保留在数据库中没有意义的任何关联上设置此项。

您无需在through has_many关联中设置它。

答案 1 :(得分:1)

根据Rails API docs on delete_all

  

删除匹配条件的记录而不首先实例化记录,因此不调用destroy方法也不调用回调。这是一个直接访问数据库的SQL DELETE语句,比destroy_all更有效。 特别注意关系:关联中定义的依赖规则不受尊重。返回受影响的行数。

我加粗了相关的文字;进一步在文档中:

  

如果需要销毁依赖关联或调用before_ *或after_destroy回调,请改用destroy_all方法。

总之,您现在拥有孤立的Favorite条记录。我会启动rails c并销毁孤立的记录,并在下次运行任何delete函数时注意。