我通过遵循这篇出色的文章为我的铁路应用程序实现了一个偏爱的系统。
这是我的设置:
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
功能时要注意。