在类别模型中查找类别 - Rails

时间:2015-12-11 09:27:51

标签: ruby-on-rails model controller

删除类别后,还需要销毁具有相同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

的CategoriesController中抓取self.id

先谢谢

2 个答案:

答案 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方法。