【问题标题】:How to delete all the associations of a model when deleting it in Rails 5在Rails 5中删除模型时如何删除模型的所有关联
【发布时间】:2018-03-06 02:09:21
【问题描述】:

我的项目中有 3 个模型。用户,膳食和食物。 用户有很多餐。一顿饭可以有很多食物,一个食物可以是很多餐的一部分。 用户和餐食模型属于 has_many 关联,而餐食和食物模型属于 has_many :through 关联。餐食和食物模型的连接模型称为 MealFood。

删除用户时,我已经删除了属于该用户的所有餐点。但是我不能让它也删除属于用户的所有膳食关联。

我需要删除meal_foods 表中meal_id 属于被删除用户的每条记录。

用户模型

class User < ApplicationRecord
    has_many :meals, :dependent => :delete_all
end

膳食模型

class Meal < ApplicationRecord
    belongs_to :user, optional: true
    has_many :meal_foods, :dependent => :delete_all
    has_many :foods, through: :meal_foods
end

食物模型

class Food < ApplicationRecord
    has_many :meal_foods
    has_many :meals, through: :meal_foods
end

MealFood 模型

class MealFood < ApplicationRecord
  belongs_to :meal
  belongs_to :food
end

提前致谢!

【问题讨论】:

    标签: ruby-on-rails database model-view-controller model associations


    【解决方案1】:

    您可能想要dependent: :destroy,而不是dependent: :delete_all:delete_all 不会运行回调,这可能就是为什么您的更深层次的关联仍然存在。

    请参阅文档here

    对于has_manydestroydestroy_all 将始终调用销毁 删除记录的方法,以便运行回调。 但是 deletedelete_all 将根据以下内容进行删除 :dependent 选项指定的策略,如果没有 :dependent 给出选项,那么它将遵循默认策略。默认 策略是什么都不做(将外键保留为父 ID set),除了has_many :through,默认策略是 delete_all(删除连接记录,不运行它们的回调)。

    This 线程有更好的答案。

    【讨论】:

    • 你的意思是dependent: :destroy,而不是dependent :destroy_all,因为我收到了这个错误syntax error, unexpected ':', expecting keyword_end has_many :meals, :dependent :destroy_all
    • 谢谢你成功了!由于我使用的是设计,所以在删除它时遇到了问题,但事实证明这是因为我使用的连接模型没有 id 列。只是说如果有人有同样的问题,只需在您的联接表中添加一个主键!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多