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

Constant Summary collapse

@@did_send_deprecation_notice =
false

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dir, connection) ⇒ ErbSqlTemplates

Returns a new instance of ErbSqlTemplates.



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

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

Instance Attribute Details

#connectionObject (readonly)

Returns the value of attribute connection.



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

def connection
  @connection
end

Instance Method Details

#execute(name, **data) ⇒ Object



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

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

#load_template(name) ⇒ Object

returns string of the template



49
50
51
52
# File 'lib/erb_sql_templates.rb', line 49

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

#locate_template(name) ⇒ Object

Returns string of the filename



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/erb_sql_templates.rb', line 31

def locate_template(name)
  results = Dir.glob(@directory + "/#{name}.{erb.sql,sql.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.sql' in the directory '#{@directory}'.")
  else
    # Check if they are using old file extensions. Only do it once though.
    if @@did_send_deprecation_notice != true && results.first.match(/\.sql\.erb$/)
      @@did_send_deprecation_notice = true
      puts "Deprecation Notice: .sql.erb extensions for ERB SQL templates has been deprecated in favor of .erb.sql extensions."
    end
    
    return results.first
  end
end

#render(template_name, **data) ⇒ Object

Returns built sql



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

def render(template_name, **data)
  scope      = TemplateScope.new(self, 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