删除类别后,还需要销毁具有相同category_id
的内容/帖子。
这是我的分类控制器。
#Categories Controller
def destroy
authorize @category
@category.destroy
respond_to do |format|
format.html { redirect_to categories_url, notice: 'Category was successfully destroyed.' }
format.json { head :no_content }
end
end
private
def set_category
@category = Category.find(params[:id])
end
def category_params
params.require(:category).permit(:title, :user_id, :image)
end
在我的分类模型中,我添加了after_destory
。
#Category model
after_destroy :remove_content
private
def remove_content
if Content.exists?(:category_id => self.id)
Content.destroy(the_content)
end
end
def the_content
@the_content = Content.where(category_id: self.id)
end
我使用self.id
来抓取category_id
,但该类别使用id和title作为uri。
def to_param
"#{id} #{title}".parameterize
end
内容属于类别。
#Content model
class Content < ActiveRecord::Base
has_attached_file :image, styles: { medium: "300x160#", thumb: "100x53#" }, default_url: "/images/:style/missing.png"
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
belongs_to :user
belongs_to :category
def to_param
"#{id} #{title}".parameterize
end
end
如何在不使用category_id
self.id
先谢谢
答案 0 :(得分:3)
只需使用关联:
classs Category < ActiveReocrd::Base
has_many :contents, dependent: :destroy
dependend: :destroy
完全符合您的目标。它添加了一个钩子来销毁属于已删除类别的所有内容。注意,不要使用@category.delete
因为它没有触发任何挂钩 - 总是使用@category.destroy
答案 1 :(得分:0)
与BroiStaste
所说的一样,您最好使用dependent: :destroy
模型中的Category
开关:
#app/models/category.rb
class Category < ActiveRecord::Base
has_many :contents, dependent: :destroy
这是一个非常简单的原则,因为你告诉ActiveRecord,如果你销毁一个Category
对象(这就是你正在做的事情),它应该销毁任何dependent
{ {1}}它拥有的对象。
来自Docs:
如果您将
Content
选项设置为:
:dependent
,当对象被销毁时,将在其关联对象上调用destroy。:destroy
,当对象被销毁时,所有关联的对象都将直接从数据库中删除而不调用它们的destroy方法。