我无法理解为什么依赖:选项不会删除我的关联......
Rails api docs这样说:
"删除或销毁?
has_many和has_and_belongs_to_many关联的方法有destroy,delete,destroy_all和delete_all。
...
对于has_many,destroy和destroy_all将始终调用正在删除的记录的destroy方法,以便运行回调。 但是delete和delete_all将根据:dependent options 指定的策略进行删除,或者如果没有给出依赖选项,则它将遵循默认策略。默认策略是不执行任何操作(将外键保留为父ID),但has_many:through除外,其中默认策略为delete_all(删除连接记录,不运行其回调)。"
好的,那么为什么我的 ...删除...根据:dependent options 指定的策略进行删除?
我有一个UserProfile模型,它与我的CustomSkill模型有 has_many 关系;我的CustomSkill模型 belongs_to 一个UserProfile。我在UserProfile模型与CustomSkill的关联上设置了 dependent :: delete_all ,但是当我删除UserProfile时,关联的CustomSkills无法删除。
P.S。如果我在删除我的UserProfile时使用 destroy ,它似乎工作,但我试图避免使用delete / delete_all应该做的回调(如果我理解'回调正确,在删除时运行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
答案 0 :(得分:2)
delete
不会触发回调(包括dependent: :delete_all
)。所以当你说
UserProfile.find_by_id(destroy_params).delete
不运行UserProfile的回调(包括删除所有关联的CustomSkills的回调)。
要运行回调(包括dependent: :delete_all
),请使用destroy
。
UserProfile.find_by_id(destroy_params).destroy