Class: ActiveRecord::Migration

Inherits:
Object
  • Object
show all
Defined in:
lib/pgtrigger/active_record/migration.rb

Instance Method Summary collapse

Instance Method Details

#create_trigger(table_name, trigger_name, after: nil, before: nil, declare: nil) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/pgtrigger/active_record/migration.rb', line 3

def create_trigger(table_name, trigger_name, after: nil, before: nil, declare: nil)
  raise "Not defined after or before for create_trigger" unless after || before
  raise "Define only on after or before" if after && before

  trigger_name = Pgtrigger::Utils.build_trigger_name(table_name, trigger_name)

  if declare
    declare = "DECLARE \n\t\t#{declare.map{|var| var.to_a.join(" ")}.join(";\n\t\t")};"
  end

  execute(<<-TRIGGERSQL
      CREATE OR REPLACE FUNCTION #{trigger_name}_func()
        RETURNS trigger
        LANGUAGE plpgsql
      AS $function$
      #{declare}
      BEGIN
        #{yield}
      END;
      $function$
    TRIGGERSQL
  )

  after = after.join(" OR ") if ["Array"].include?(after.class.to_s)
  after = "AFTER #{after}" if after

  before = before.join(" OR ") if ["Array"].include?(before.class.to_s)
  before = "BEFORE #{before}" if before

  execute(<<-TRIGGERSQL
      CREATE TRIGGER #{trigger_name}_trigger
        #{after} #{before} ON #{table_name}
        FOR EACH ROW EXECUTE PROCEDURE #{trigger_name}_func()
    TRIGGERSQL
  )
end

#remove_trigger(table_name, trigger_name = nil) ⇒ Object



40
41
42
43
44
45
# File 'lib/pgtrigger/active_record/migration.rb', line 40

def remove_trigger(table_name, trigger_name = nil)
  trigger_name = Pgtrigger::Utils.build_trigger_name(table_name, trigger_name)

  execute("DROP TRIGGER IF EXISTS #{trigger_name}_trigger ON #{table_name};")
  execute("DROP FUNCTION IF EXISTS #{trigger_name}_func();")
end