Module: ArelExtensions

Defined in:
lib/arel_extensions/visitors/oracle.rb,
lib/arel_extensions/math.rb,
lib/arel_extensions/aliases.rb,
lib/arel_extensions/helpers.rb,
lib/arel_extensions/railtie.rb,
lib/arel_extensions/version.rb,
lib/arel_extensions/nodes/abs.rb,
lib/arel_extensions/nodes/md5.rb,
lib/arel_extensions/nodes/std.rb,
lib/arel_extensions/nodes/sum.rb,
lib/arel_extensions/attributes.rb,
lib/arel_extensions/nodes/case.rb,
lib/arel_extensions/nodes/cast.rb,
lib/arel_extensions/nodes/ceil.rb,
lib/arel_extensions/nodes/json.rb,
lib/arel_extensions/nodes/rand.rb,
lib/arel_extensions/nodes/then.rb,
lib/arel_extensions/nodes/trim.rb,
lib/arel_extensions/nodes/wday.rb,
lib/arel_extensions/comparators.rb,
lib/arel_extensions/nodes/blank.rb,
lib/arel_extensions/nodes/floor.rb,
lib/arel_extensions/nodes/log10.rb,
lib/arel_extensions/nodes/power.rb,
lib/arel_extensions/nodes/round.rb,
lib/arel_extensions/nodes/union.rb,
lib/arel_extensions/nodes/format.rb,
lib/arel_extensions/nodes/length.rb,
lib/arel_extensions/nodes/locate.rb,
lib/arel_extensions/nodes/repeat.rb,
lib/arel_extensions/predications.rb,
lib/arel_extensions/date_duration.rb,
lib/arel_extensions/nodes/collate.rb,
lib/arel_extensions/nodes/is_null.rb,
lib/arel_extensions/nodes/matches.rb,
lib/arel_extensions/nodes/replace.rb,
lib/arel_extensions/nodes/soundex.rb,
lib/arel_extensions/set_functions.rb,
lib/arel_extensions/insert_manager.rb,
lib/arel_extensions/math_functions.rb,
lib/arel_extensions/nodes/coalesce.rb,
lib/arel_extensions/nodes/duration.rb,
lib/arel_extensions/nodes/function.rb,
lib/arel_extensions/null_functions.rb,
lib/arel_extensions/visitors/mssql.rb,
lib/arel_extensions/visitors/mysql.rb,
lib/arel_extensions/nodes/date_diff.rb,
lib/arel_extensions/nodes/substring.rb,
lib/arel_extensions/nodes/union_all.rb,
lib/arel_extensions/visitors/ibm_db.rb,
lib/arel_extensions/visitors/sqlite.rb,
lib/arel_extensions/visitors/to_sql.rb,
lib/arel_extensions/string_functions.rb,
lib/arel_extensions/boolean_functions.rb,
lib/arel_extensions/nodes/change_case.rb,
lib/arel_extensions/nodes/find_in_set.rb,
lib/arel_extensions/visitors/oracle12.rb,
lib/arel_extensions/visitors/postgresql.rb,
lib/arel_extensions/common_sql_functions.rb,
lib/arel_extensions/nodes/formatted_number.rb,
lib/arel_extensions/visitors/convert_format.rb,
lib/arel_extensions/nodes/aggregate_function.rb,
lib/arel_extensions/nodes/levenshtein_distance.rb

Overview

require ‘oracle_visitor’

Defined Under Namespace

Modules: Aliases, Attributes, BooleanFunctions, Comparators, DateDuration, InsertManager, Math, MathFunctions, Nodes, NullFunctions, Predications, SetFunctions, StringFunctions, Visitors Classes: CommonSqlFunctions, Railtie

Constant Summary collapse

VERSION =
"2.1.2".freeze

Class Method Summary collapse

Class Method Details

.column_of(table_name, column_name) ⇒ Object



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

def self.column_of(table_name, column_name)
  use_arel_table = !ActiveRecord::Base.connected? || \
    (ActiveRecord::Base.connection.pool.respond_to?(:schema_cache) && ActiveRecord::Base.connection.pool.schema_cache.nil?)

  if use_arel_table
    column_of_via_arel_table(table_name, column_name)
  else
    if ActiveRecord::Base.connection.pool.respond_to?(:pool_config)
      ActiveRecord::Base.connection.pool.pool_config.schema_cache.columns_hash(table_name)[column_name]
    elsif ActiveRecord::Base.connection.pool.respond_to?(:schema_cache)
      ActiveRecord::Base.connection.pool.schema_cache.columns_hash(table_name)[column_name]
    else
      puts ">>> We really shouldn't be here #{table_name}.#{column_name}"
      column_of_via_arel_table(table_name, column_name)
    end
  end
end

.column_of_via_arel_table(table_name, column_name) ⇒ Object

column_of

Before the creation of these methods, getting the column name was done uniquely through the code found in ‘column_of_via_arel_table`.

This turned out to be unreliable, most notably when using adapters that do not come with activerecord standard batteries. SQL Server is the most notorious example.

Currently, we’re using a needlessly complicated way to address this issue. Different versions of activerecord are behaving differently; the public APIs do not seem to come with any guarantees, so we need to be sure that we’re coveing all these cases.



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/arel_extensions/helpers.rb', line 18

def self.column_of_via_arel_table(table_name, column_name)
  begin
    Arel::Table.engine.connection.schema_cache.columns_hash(table_name)[column_name]
  rescue NoMethodError
    nil
  rescue Exception => e
    puts "Failed to fetch column info for #{table_name}.#{column_name} ."
    puts "This should never be reached."
    puts "#{e.class}: #{e}"
    nil
  end
end