Class: ErbSqlTemplates

Inherits:
Object
  • Object
show all
Defined in:
lib/erb_sql_templates.rb

Overview

Name template files as some_query.sql.erb – Use <%= h my_var %> - h helper will sanitize est = ErbSqlTemplates.new(Rails.root.to_s + ‘/db/sql’, ActiveRecord::Base.connection) est.execute(:some_sql, :my_var => ‘Foo!’) sql = est.render(:some_sql, :my_var => ‘Foo!’)

Defined Under Namespace

Classes: TemplateScope

Instance Method Summary collapse

Constructor Details

#initialize(dir, connection) ⇒ ErbSqlTemplates

Returns a new instance of ErbSqlTemplates.



11
12
13
14
# File 'lib/erb_sql_templates.rb', line 11

def initialize(dir, connection)
  @directory  = dir
  @connection = connection
end

Instance Method Details

#execute(name, **data) ⇒ Object



16
17
18
19
# File 'lib/erb_sql_templates.rb', line 16

def execute(name, **data)
  sql = render(name, data)
  @connection.execute(sql)
end

#load_template(name) ⇒ Object

returns string of the template



42
43
44
45
# File 'lib/erb_sql_templates.rb', line 42

def load_template(name)
  filename = locate_template(name)
  File.read(filename)
end

#locate_template(name) ⇒ Object

Returns string of the filename



30
31
32
33
34
35
36
37
38
39
# File 'lib/erb_sql_templates.rb', line 30

def locate_template(name)
  results = Dir.glob(@directory + "/#{name}.{sql.erb,erb}")
  if results.length > 1
    raise Exception.new("Too many templates have the name '#{name}'. ")
  elsif results.length == 0
    raise Exception.new("Cannot find template '#{name}.erb' or '#{name}.sql.erb' in the directory '#{@directory}'.")
  else
    return results.first
  end
end

#render(template_name, **data) ⇒ Object

Returns built sql



22
23
24
25
26
27
# File 'lib/erb_sql_templates.rb', line 22

def render(template_name, **data)
  scope      = TemplateScope.new(@connection, data)
  erb_string = load_template(template_name)
  renderer   = ERB.new(erb_string, 0, '>') # thread level zero, and '>' means no new lines for <%= %>
  return renderer.result(scope.get_binding)
end