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 :)
Discover More Reads
Categories: