How to delete polymorphic models cascade
Dmitry Voronov
Posted on July 3, 2019
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 :)
💖 💪 🙅 🚩
Dmitry Voronov
Posted on July 3, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
codenewbie My Journey Through Ruby Event Manager, Hangman, and Tackling Coolant Leaks
November 29, 2024