class Hayfork::Triggers
Attributes
_triggers[R]
haystack[R]
Public Class Methods
new(haystack)
click to toggle source
# File lib/hayfork/triggers.rb, line 5 def initialize(haystack) @haystack = haystack @_triggers = [] end
Public Instance Methods
<<(trigger)
click to toggle source
# File lib/hayfork/triggers.rb, line 10 def <<(trigger) _triggers << trigger end
create()
click to toggle source
# File lib/hayfork/triggers.rb, line 14 def create _triggers.map { |args| psql_create_triggers_for(*args) }.join end
drop()
click to toggle source
# File lib/hayfork/triggers.rb, line 18 def drop _triggers.map { |model, _, options| psql_drop_triggers_for(model, options) }.join end
rebuild()
click to toggle source
# File lib/hayfork/triggers.rb, line 30 def rebuild ([truncate] + _triggers.map { |args| psql_inserts_for(*args) }).join end
replace()
click to toggle source
# File lib/hayfork/triggers.rb, line 22 def replace [drop, create].join end
truncate()
click to toggle source
# File lib/hayfork/triggers.rb, line 26 def truncate "TRUNCATE #{haystack.table_name};\n" end
Private Instance Methods
function_name(model, options)
click to toggle source
# File lib/hayfork/triggers.rb, line 71 def function_name(model, options) options.fetch(:name, "maintain_#{model.table_name}_in_#{haystack.table_name}") end
psql_create_triggers_for(model, statements, options)
click to toggle source
# File lib/hayfork/triggers.rb, line 37 def psql_create_triggers_for(model, statements, options) name = function_name(model, options) <<~SQL CREATE FUNCTION #{name}() RETURNS trigger AS $$ BEGIN IF TG_OP = 'DELETE' THEN #{statements.to_delete_sql} RETURN OLD; ELSIF TG_OP = 'UPDATE' THEN #{statements.to_update_sql} RETURN NEW; ELSIF TG_OP = 'INSERT' THEN #{statements.to_insert_sql} RETURN NEW; END IF; RETURN NULL; -- result is ignored since this is an AFTER trigger END; $$ LANGUAGE plpgsql; CREATE TRIGGER #{name}_trigger BEFORE INSERT OR UPDATE OR DELETE ON #{model.table_name} FOR EACH ROW EXECUTE PROCEDURE #{name}(); SQL end
psql_drop_triggers_for(model, options)
click to toggle source
# File lib/hayfork/triggers.rb, line 64 def psql_drop_triggers_for(model, options) name = function_name(model, options) <<~SQL DROP FUNCTION IF EXISTS #{name}() CASCADE; SQL end
psql_inserts_for(model, statements, options)
click to toggle source
# File lib/hayfork/triggers.rb, line 60 def psql_inserts_for(model, statements, options) "#{statements.to_insert_sql(from: false)}\n" if options.fetch(:rebuild, true) end