class FromClauseTranslate::TranslatedColumnsBuilder
Public Class Methods
new(relation, klass, without_projections)
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 2 def initialize relation, klass, without_projections @relation = relation @klass = klass @arel = relation.arel @without_projections = without_projections @columns = [] @has_translated = false end
Public Instance Methods
perform()
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 11 def perform @skip_translated = [] add_translated_columns_from_values add_translated_columns_from_projections add_translated_columns_from_cores add_translated_columns_from_joins add_translated_columns_from_orders @columns if @has_translated end
Private Instance Methods
add_translated_columns_from_cores()
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 60 def add_translated_columns_from_cores @arel.ast.cores.each do |core| add_translated_columns_from_groups core add_translated_columns_from_nodes core.wheres add_translated_columns_from_nodes core.havings end end
add_translated_columns_from_groups(core)
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 68 def add_translated_columns_from_groups core core.groups.each do |group| expr = group.expr name = expr[0] == '"' ? expr[1...-1] : expr translated_selection name end end
add_translated_columns_from_joins()
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 92 def add_translated_columns_from_joins joins = @relation.instance_variable_get(:@values)[:joins] return unless joins joins.each do |join| ref = @klass.reflections[join.to_s] next if !ref || !ref.is_a?(ActiveRecord::Reflection::BelongsToReflection) translated_selection ref.join_keys.foreign_key end end
add_translated_columns_from_nodes(nodes)
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 76 def add_translated_columns_from_nodes nodes nodes.each do |node| node.children.each do |child| next unless child.respond_to? :left left = child.left if left.respond_to?(:relation) && left.relation.table_name != @klass.table_name next end translated_selection child.left.name end end end
add_translated_columns_from_orders()
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 104 def add_translated_columns_from_orders @arel.ast.orders.each do |name| if name.respond_to?(:expr) name = name.expr name = name.name if name.respond_to?(:name) end translated_selection name end end
add_translated_columns_from_projections()
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 39 def add_translated_columns_from_projections return if @without_projections @arel.projections.each do |column| next if column.is_a?(String) && column[0] != '"' arel_projection_translation column end end
add_translated_columns_from_values()
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 24 def add_translated_columns_from_values translated = @relation.instance_variable_get(:@values)[:translated] return unless translated @has_translated = true translated.each do |column| next translated_selection(column) unless column.is_a? Hash column.each do |key, value| @skip_translated << key.to_s @columns << "#{value} AS #{key}" unless value.nil? end end end
arel_projection_translation(column)
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 49 def arel_projection_translation column column = column.name if column.is_a? Arel::Attributes::Attribute column = column.to_s unless column.is_a? String name = column.first == '"' ? column[1...-1] : column return if @skip_translated.include? name translated_selection name, column end
translated_selection(name, original = nil)
click to toggle source
# File lib/from_clause_translate/translated_columns_builder.rb, line 114 def translated_selection name, original = nil sym = name.to_sym translates = @klass.respond_to?(:translates?) && @klass.translates?(sym) @has_translated = true if translates return @columns << @klass._translation_data.selections[I18n.locale][sym] end return unless @klass.columns_hash[name.to_s] @columns << (original ? original.to_sym : sym) end