class Post < ActiveRecord::Base
has_many :posts_tags
has_many :tags, through: :posts_tags
end
class PostsTag < ActiveRecord::Base
belongs_to :post
belongs_to :tag
end
class Tag < ActiveRecord::Base
has_many :posts_tags
has_many :posts, through: :posts_tags
end
Quando Post viene eliminato, desidero eliminare anche tutte le sue associazioni. NON voglio le convalide sul modello PostsTag da eseguire. Voglio solo cancellato.Modo corretto per cancellare has_many: through join records?
Ho riscontrato che l'aggiunta di una dipendenza dalla relazione ai tag Post dal modello Post funziona come voglio: has_many :posts_tags, dependent: :delete_all
.
Tuttavia, la documentazione sull'argomento sembra suggerire che dovrei farlo invece: has_many :tags, through: :posts_tags, dependent: :delete_all
. Quando faccio questo, l'oggetto Tag viene distrutto e l'oggetto join rimane.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many
Per has_many, distruggere sempre chiamare il metodo distruggere del record (s) essendo rimosso in modo che callback vengono eseguiti. Tuttavia, l'eliminazione eseguirà l'eliminazione in base alla strategia specificata dall'opzione: dipendente o, in caso contrario, l'opzione dipendente seguirà la strategia predefinita. La strategia predefinita è: nullify (imposta le chiavi esterne su zero), eccetto has_many: through, dove la strategia predefinita è delete_all (elimina i record di join, senza eseguire i callback).
- Come posso avere la strategia predefinita effettivamente utilizzato? Se esco: dipendente completamente, nessun record viene rimosso. E non posso solo indicare: dipende da una relazione has_many. Rails ritorna e dice "L'opzione: dependent prevede: destroy,: delete_all,: nullify or: restrict ({})".
- Se non specificare: dipende uno dei rapporti, che non annulla il post_id sull'oggetto PostsTag come sembra suggerire
Forse sto leggendo questo torto e l'approccio che ho trovato funziona è il modo corretto?
Cosa succede se un tag viene utilizzato da più post? Se un post viene eliminato, gli altri post saranno interessati. –
true e Tag dovrebbe avere "has_many: posts, through:: posts_tags' not posts, userei' has_many: posts_tags, dependent:: destroy' per eliminare posts_tag e lasciare i tag da solo. È possibile eliminare tag orfani con un'attività rake o console. – rmagnum2002
Risolto l'associazione, grazie. Sto solo cercando di capire la documentazione.La formulazione è confusa – Brian