Sei que isso provavelmente está em algum lugar da Internet, mas não consigo encontrar a resposta aqui no Stackoverflow, então pensei em aumentar um pouco a base de conhecimento aqui.
Eu sou um novato em Ruby e Rails, mas minha empresa está investindo muito nisso, então estou tentando conhecê-la com um pouco mais de detalhes.
Tem sido difícil para mim mudar minha mentalidade para projetar um aplicativo a partir do "modelo" em vez do banco de dados, então estou tentando descobrir como faria todo o trabalho de design que fiz classicamente no banco de dados no Em vez disso, modelo Rails.
Portanto, a tarefa mais recente que me dei é descobrir como configurar um modelo de banco de dados Rails para fazer exclusões em cascata? Existe uma maneira fácil de fazer isso? Ou eu teria que entrar no MySql e configurar isso?
fonte
:delete_all
e:destroy
para isso. Ambos farão com que as associações filho (1 nível para deletar [carece de fontes] en
para destruir (se seus filhos tiverem destrói dependentes)) sejam removidas do banco de dados, mas:destroy
irão instanciar cada objeto filho e executar qualquer retorno de chamada primeiro, enquanto:delete_all
irá executar diretamente um Instrução SQL DELETE no banco de dados.:destroy
é mais lento por causa disso, mas permite que você tenha retornos de chamada quando um registro é destruído. Contornando Rails em uma extremidade e potencial instanciação n ^ x na outra.Sim, você pode, se estiver usando um relacionamento como has_many, basta fazer isso
has_many :memberships, dependent: :destroy
fonte
Ao contrário da resposta fornecida, eu sugiro também fazer isso no nível do banco de dados. No caso de você ter processos diferentes ou um ambiente multi-threaded, pode acontecer que os registros não sejam apagados corretamente. Além disso, a chave estrangeira do banco de dados torna as coisas muito mais rápidas ao excluir muitos dados.
Como na resposta sugerida, faça o seguinte:
has_many :memberships, dependent: :delete_all
No entanto, também certifique-se de configurar um
foreign_key
em uma migração. Dessa forma, o banco de dados se encarrega de excluir os registros automaticamente para você.Para anular os valores quando uma associação é excluída, supondo que você tenha um modelo de usuário:
add_foreign_key :users, :memberships, on_delete: :nullify
Você também pode excluir todos os modelos sempre que uma associação for excluída
add_foreign_key :users, :memberships, on_delete: :cascade
fonte
delete_all
no modelo. A chave estrangeira cuidará de deletar tudo apropriadamente para você no nível do banco de dados.Apenas tenha em mente que delete_all não executará nenhum callback (como before_destroy e after_destroy) nos registros filho.
fonte
Parece que este plug-in pode fornecer o que você está procurando se quiser que as exclusões em cascata sejam refletidas na estrutura real do banco de dados:
http://www.redhillonrails.org/foreign_key_migrations.html
O formato para usar isso em uma migração seria mais ou menos assim:
create_table :orders do |t| t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade ... end
fonte