我已按照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;在删除之前所有这些项目都不会出现这个错误。
有没有人知道如何解决这个问题?
答案 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
函数时注意。