dependent: :delete_all 关联不删除关联记录

dependent: :delete_all association not deleting associated records

我不明白为什么我的 dependent: option 没有删除我的关联...

Rails api docs 这样说:

“删除还是销毁?

has_many 和 has_and_belongs_to_many 关联有销毁、删除、destroy_all 和 delete_all.

方法

...

对于 has_many,destroy 和 destroy_all 将始终调用被删除记录的 destroy 方法,以便回调 运行。 但是 delete 和 delete_all 将根据 :dependent 选项指定的策略进行删除,或者如果没有给出 :dependent 选项,那么它将遵循默认策略.默认策略是什么都不做(保留父ids设置的外键),除了has_many :through,默认策略是delete_all(删除连接记录,没有运行他们的回调)。"

好的,为什么我的 ...删除...不[ing] 根据 :dependent 选项指定的策略进行删除?

我有一个 UserProfile 模型,它与我的 CustomSkill 模型有 has_many 关系;我的 CustomSkill 模型 belongs_to 一个 UserProfile。我在我的 UserProfile 模型与 CustomSkill 的关联上设置了 dependent::delete_all,但是当我删除 UserProfile 时,关联的 CustomSkills 无法删除。

P.S。如果我在删除我的 UserProfile 时使用 destroy,它似乎可以工作,但我试图避免使用 delete/delete_all 应该做的回调(如果我理解 'callbacks' 正确,运行ning rails 模型回调发生删除时,因为我没有对它们进行编码)。

我在这里错过了什么?

# Controller#destroy
def destroy
   UserProfile.find_by_id(destroy_params).delete
   redirect_to profiles_url, notice: 'Profile deleted'
end

# UserProfile model
class UserProfile < ActiveRecord::Base
  ...
  has_many :custom_skills, dependent: :delete_all
end

# CustomSkill model
class CustomSkill < ActiveRecord::Base
  ...
  belongs_to :user_profile
end

# Schema.rb
create_table "user_profiles", force: :cascade do |t|
    t.string   "type"
    t.string   "profile_name"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.integer  "user_id"
end

create_table "custom_skills", force: :cascade do |t|
    t.string   "name"
    t.integer  "user_profile_id"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
end

delete不触发回调(包括dependent: :delete_all)。所以当你说

UserProfile.find_by_id(destroy_params).delete

UserProfile 的回调不是 运行(包括删除所有关联的 CustomSkill 的回调)。

到运行个回调(包括dependent: :delete_all),使用destroy.

UserProfile.find_by_id(destroy_params).destroy