Ruby on rails 删除多态关联

Ruby on rails 删除多态关联,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我已经通过以下方式为我的rails应用程序实现了一个偏好系统 以下是我的设置: 收藏夹.rb class Favorite < ActiveRecord::Base belongs_to :user belongs_to :favorited, polymorphic: true end 我确信,如果我在删除这些项目之前对它们都不满意,这个错误就不会出现 有人知道如何解决这个问题吗?根据: 删除匹配条件的记录,而不首先实例化记录,因此不调用destroy方法,也不调用回调。这是一

我已经通过以下方式为我的rails应用程序实现了一个偏好系统

以下是我的设置:

收藏夹.rb

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :favorited, polymorphic: true
end
我确信,如果我在删除这些项目之前对它们都不满意,这个错误就不会出现

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

根据:

删除匹配条件的记录,而不首先实例化记录,因此不调用destroy方法,也不调用回调。这是一条直接进入数据库的SQL DELETE语句,比销毁所有语句效率高很多。但要注意关系,尤其是:不遵守在关联上定义的依赖规则。返回受影响的行数

我将相关文本加粗;在文件中进一步说明:

如果需要销毁依赖关联或在销毁前或销毁后调用,请改用销毁所有方法


总之,您现在有了孤立的收藏夹记录。我会启动rails c并销毁孤立记录,下次运行任何删除函数时请注意。

您需要设置依赖选项

has_many :favorites, as: :favorited, dependent: :destroy
在将对象留在数据库中没有意义的任何关联上设置此选项


您无需将其设置为“通过有许多关联”。

该行看起来在这里的任何代码中都没有引用。tadman,正如mmichael在下面所说,我已孤立了我最喜欢的记录。我读了这篇文章,但我不能完全理解多态关联。我不知道如何从我的记录中删除favorite_项目,因为它们是孤立的。你认为favorite.delete_all在这里合适吗?你当然可以这样做,只要你不介意销毁你所有的收藏记录。顺便说一句,如果你只想销毁你的孤立记录,您可以运行:Favorite.wherefavorited\u type:'Project'。全部删除。查看并注意案例中的两个数据库列_id和_type:favorited_id和favorited_type。请记住,delete和delete_都将忽略dependent::destroy:
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'
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
 ActionView::Template::Error (undefined method `favorite_projects' for nil:NilClass):
has_many :favorites, as: :favorited, dependent: :destroy