Como destruir um registro com has_many, :dependent => :destruir
-
28-09-2019 - |
Pergunta
Eu construí um Trilho 3 auditlog groom com a ajuda de alguns plugins, que armazenam dados em um auditlog groom Tabela com os seguintes campos para identificação (feeded_id, feeded_type)
Então no meu caso, eu tenho um photoalbum que has_many fotos.
class PhotoAlbum < ActiveRecord::Base
has_many :photos, :dependent => :destroy
quando eu excluir um photoalbum (id=2) isto funciona muito bem para eliminar todos os associados de fotos, mas não excluir itens da caixa de auditlog groom, que são como este:(feeded_id = 2, feeded_type = PhotoAlbum)
Dado que o auditlog groom tabela não tem um "photo_album_id" coluna e não pode, existe um caminho para a instalação de um dependente > Destory com Trilhos para excluir todos os itens associados na área do auditlog groom quando um PhotoAlbum é excluído?
Obrigado, eu sei que isso é um pouco mais complicada do que a maioria.Obrigado por ler!
Solução
Eu acho que o que você está procurando é a combinação de
belongs_to :feeded, :polymorphic => true
em seu log de Auditoria de classe e
has_many :logs, :as => :feeded, :dependent => :destroy
em seu PhotoAlbum classe.
Se você não tem uma classe para representar o seu log de auditoria, você deve ser capaz de adicionar o belongs_to
para a classe existente (em seus plugins, talvez?).
Eu não tenho 100% de certeza sobre :as => :alimentadas opção, você terá que nome símbolo corretamente e não tenho a certeza que o ActiveRecord vai esperar, mas o belongs_to
relacionamento vai olhar para feeded_id e feeded_type, então, quando o 'pai' objeto é um PhotoAlbum ele irá juntar-se corretamente em photo_album.id = audit_logs.feeded_id AND audit_logs.feeded_type = 'PhotoAlbum'
.Uma vez que este não requer quaisquer alterações ao seu banco de dados, todo o código existente deve continuar a trabalhar.
Você pode ler sobre o opções para associações aqui.