删除多态性关联



我通过遵循这篇出色的文章为我的铁路应用程序实现了一个偏爱的系统。

这是我的设置:


fale.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'

faly_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在某些项目仍然"受到青睐"时删除我的项目,但现在我有一个错误:

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

我敢肯定,如果我在删除这些项目之前就"不满"了所有这些项目,此错误不会出现。

有人知道如何解决此问题吗?

您将要设置因选项。

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

将其设置在任何关联中,将对象留在DB中是没有意义的。

您无需在through HAS_MANY关联上设置它。

delete_all上的rails api文档:

删除匹配条件的记录,而无需先实例化记录,因此不调用销毁方法或调用回调。这是一个单一的SQL删除语句,直接进入数据库,比Destric_all更有效。请谨慎对待关系,尤其是:不荣幸根据关联定义的依赖规则。返回影响的行数。

我对相关文本进行了粗体;在文档中进一步:

如果您需要销毁依赖的关联或以前致电_*或after_destroy回调,请改用Destry_all方法。

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

最新更新