2015-03-29 2 views
0

Я не могу понять, почему мой зависит: опция не удалять мои ассоциации ...зависит:: delete_all объединение не удаление соответствующих записей

Rails api docs говорят это:

«Удалить или уничтожить?

has_many и has_and_belongs_to_many объединения имеют методы уничтожения, удаления destroy_all и delete_all.

...

Для has_many, destroy и destroy_all всегда будут вызывать метод уничтожения удаляемой записи (ов), чтобы выполнялись обратные вызовы. Однако delete и delete либо будут выполнять удаление в соответствии со стратегией, заданной опцией: зависимый параметр, или если задана опция: зависимая опция, то она будет следовать стратегии по умолчанию. Стратегия по умолчанию - ничего не делать (оставить внешние ключи с установленными родительскими идентификаторами), за исключением has_many: through, где стратегия по умолчанию - delete_all (удалить записи объединения, не выполняя обратные вызовы). "

Хорошо, так почему же не мой ... удалять ... сделать [я] удаление в соответствии со стратегией, указанной: зависимый вариант

У меня есть модель UserProfile, которая имеет has_many отношения с моим Модель CustomSkill, моя модель CustomSkill принадлежит_от Пользовательский профайл. Я установил зависимый:: delete_all в ассоциации что моя модель UserProfile имеет с CustomSkill, но когда я удаляю UserProfile, связанные с ним CustomSkills не удаляются.

P.S. Если я использую , уничтожаю при удалении моего UserProfile, это похоже на работу, но я стараюсь избегать использования обратных вызовов, которые должно выполняться 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

delete не вызывает обратные вызовы (в том числе dependent: :delete_all). Так что, когда вы говорите

UserProfile.find_by_id(destroy_params).delete 

обратные вызовы для UserProfile не выполняются (в том числе обратного вызова, чтобы удалить все связанные с ним CustomSkills).

Чтобы выполнить обратные вызовы (включая dependent: :delete_all), используйте destroy.

UserProfile.find_by_id(destroy_params).destroy 
Смежные вопросы