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("      CREATE OR REPLACE FUNCTION \#{trigger_name}_func()\n        RETURNS trigger\n        LANGUAGE plpgsql\n      AS $function$\n      \#{declare}\n      BEGIN\n        \#{yield}\n      END;\n      $function$\n    TRIGGERSQL\n  )\n\n  after = after.join(\" OR \") if [\"Array\"].include?(after.class.to_s)\n  after = \"AFTER \#{after}\" if after\n\n  before = before.join(\" OR \") if [\"Array\"].include?(before.class.to_s)\n  before = \"BEFORE \#{before}\" if before\n\n  execute(<<-TRIGGERSQL\n      CREATE TRIGGER \#{trigger_name}_trigger\n        \#{after} \#{before} ON \#{table_name}\n        FOR EACH ROW EXECUTE PROCEDURE \#{trigger_name}_func()\n    TRIGGERSQL\n  )\nend\n"

#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