class Clearly::Query::Helper
Utility methods for working with Arel.
Public Class Methods
Construct a SQL EXISTS clause. @param [Arel::Nodes::Node] node @return [Arel::Nodes::Node]
# File lib/clearly/query/helper.rb, line 66 def exists(node) Arel::Nodes::Exists.new(node) end
Construct an Arel representation of a SQL function. @param [String] name @param [String, Arel::Nodes::Node] expression @param [String] function_alias @return [Arel::Nodes::Node]
# File lib/clearly/query/helper.rb, line 75 def named_function(name, expression, function_alias = nil) Arel::Nodes::NamedFunction.new(name, expression, function_alias) end
Construct a SQL literal. This is useful for sql that is too complex for Arel. @param [String] value @return [Arel::Nodes::Node]
# File lib/clearly/query/helper.rb, line 51 def sql_literal(value) Arel::Nodes::SqlLiteral.new(value) end
Construct a SQL quoted string. This is used for fragments of SQL. @param [String] value @return [Arel::Nodes::Node]
# File lib/clearly/query/helper.rb, line 59 def sql_quoted(value) Arel::Nodes.build_quoted(value) end
Concatenate one or more strings @param [Array<String>] args strings to concatenate @return [Arel::Nodes::Node]
# File lib/clearly/query/helper.rb, line 11 def string_concat(*args) adapter = ActiveRecord::Base.connection.adapter_name.underscore.downcase case adapter when 'mysql' named_function('concat', args) when 'sqlserver' string_concat_infix('+', *args) when 'postgres' when 'sq_lite' string_concat_infix('||', *args) else fail ArgumentError, "unsupported database adapter '#{adapter}'" end end
Concatenate strings using an operator @param [Object] operator infix operator @param [Array<String>] args strings to concatenate @return [Arel::Nodes::Node]
# File lib/clearly/query/helper.rb, line 31 def string_concat_infix(operator, *args) if args.blank? || args.size < 2 fail ArgumentError, "string concatenation requires operator and two or more arguments, given '#{args.size}'" end result = Arel::Nodes::InfixOperation.new(operator, args[0], args[1]) if args.size > 2 args.drop(2).each do |a| result = Arel::Nodes::InfixOperation.new(operator, result, a) end end result end