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
我不明白为什么我的 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