应用场景:
图书分类和图书,一对多关系。
我想实现当分类中还有所属图书,就不能让用户删除分类。
我是这样做的:
Model中
控制器中
上面的代码和逻辑从表面上,是没有问题的,还是现实是:图书分类中有图书存在,分类还是可以删除,在if_still_has_books方法中self.books.blank?始终为true。
我左找右找上找下找,原来是has_many :books, :dependent => :nullify中的:dependent => :nullify引来了诡异,去掉:dependent => :nullify,世界又变得美好了。
图书分类和图书,一对多关系。
我想实现当分类中还有所属图书,就不能让用户删除分类。
我是这样做的:
Model中
class CategroyHasBooksException < RuntimeError;end
class BookCategory < ActiveRecord::Base
has_many :books, :dependent => :nullify
before_destroy :if_still_has_books
def if_still_has_books
raise CategroyHasBooksException unless self.books.blank?
end
控制器中
# 删除图书分类
def destroy
@book_category = BookCategory.find(params[:id])
@book_category.destroy
rescue CategroyHasBooksException
flash[:warn] = "图书分类[#{@group_category.name}]中还有图书,你不能删除此分类"
else
flash[:notice] = "图书分类[#{@group_category.name}]已删除"
ensure
redirect_to :action => 'index'
end
上面的代码和逻辑从表面上,是没有问题的,还是现实是:图书分类中有图书存在,分类还是可以删除,在if_still_has_books方法中self.books.blank?始终为true。
我左找右找上找下找,原来是has_many :books, :dependent => :nullify中的:dependent => :nullify引来了诡异,去掉:dependent => :nullify,世界又变得美好了。