在删除记录之前从关联模型更新记录

时间:2016-10-10 08:00:36

标签: ruby-on-rails ruby-on-rails-4 callback

我有以下型号

class Category < ActiveRecord::Base
  has_many :posts

  before_destroy :reset_posts_category

  def reset_posts_category
    ???
  end
end

class Post < ActiveRecord::Base
  belongs_to :category
end

我想要做的是创建一个回调,所以在删除类别之前更新属于此类别的所有帖子 以设置默认值(post.category_id = 0) 。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

你可以试试这个,

class Category < ActiveRecord::Base
  has_many :posts, dependent: :nullify
end

希望这会对你有所帮助。

答案 1 :(得分:2)

我建议您查看:dependent

的选项has_many

将代码更改为 has_many :posts, dependent: :nullify Rails会自动将您数据库中的所有posts设置为null

其他dependent选项包括:

  • :destroy使用回调调用所有对象的销毁
  • :delete_all直接从db中删除所有记录而不回调
  • 如果记录存在,
  • :restrict_with_exception提出一个例外
  • :restrict_with_error向“错误
  • 添加错误

答案 2 :(得分:1)

试试这个:

class Category < ActiveRecord::Base
  has_many :posts

  before_destroy :reset_posts_category

  def reset_posts_category
    self.posts.update_all(category_id: 0)
  end
end

您也可以使用@Hardik Upadhyay和@ slowjack2k所说的dependent :nullify,这比更新category_id: 0要好。