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