How to delete polymorphic models cascade
If you use a polymorphic model in your Rails application, like in example
class Trade < ActiveRecord::Base has_many :gl_entries, as: :source, dependent: :destroy end class GlEntry < ActiveRecord::Base belongs_to :source, polymorphic: true end
You will not be able to add the usual foreign keys for cascading delete records. But this can be implemented using a database.
To do this, you need to write a trigger in the database that will run the delete function for each record.
CREATE FUNCTION deleteGlEntriesOfTrade() RETURNS TRIGGER SET SCHEMA 'public' LANGUAGE plpgsql AS $$ BEGIN DELETE FROM gl_entries WHERE source_id = OLD.id AND source_type = 'Trade'; RETURN OLD; END; $$; CREATE TRIGGER deleteTradesGlEntriesTrigger BEFORE DELETE ON trades FOR EACH ROW EXECUTE PROCEDURE deleteGlEntriesOfTrade();
Create a migration and use :)
Tweet