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

时间:2015-03-29 21:50:34

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

我无法理解为什么依赖:选项不会删除我的关联......

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

1 个答案:

答案 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