class ErbSqlTemplates

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!’)

Attributes

connection[R]

Public Class Methods

new(dir, connection) click to toggle source
# File lib/erb_sql_templates.rb, line 12
def initialize(dir, connection)
  @directory  = dir
  @connection = connection
end

Public Instance Methods

execute(name, **data) click to toggle source
# File lib/erb_sql_templates.rb, line 17
def execute(name, **data)
  sql = render(name, data)
  @connection.execute(sql)
end
load_template(name) click to toggle source

returns string of the template

# File lib/erb_sql_templates.rb, line 49
def load_template(name)
  filename = locate_template(name)
  File.read(filename)
end
locate_template(name) click to toggle source

Returns string of the filename

# 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) click to toggle source

Returns built sql

# 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