Module: ActiveRecord::Relation::Extended

Included in:
ActiveRecord::Relation
Defined in:
lib/from_clause_translate/active_record_relation.rb

Instance Method Summary collapse

Instance Method Details

#add_translated_column(column) ⇒ Object



15
16
17
# File 'lib/from_clause_translate/active_record_relation.rb', line 15

def add_translated_column(column)
  (@values[:translated] ||= []) << column
end

#add_translated_columns(columns) ⇒ Object



11
12
13
# File 'lib/from_clause_translate/active_record_relation.rb', line 11

def add_translated_columns(columns)
  (@values[:translated] ||= []).concat columns
end

#apply_translatesObject



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/from_clause_translate/active_record_relation.rb', line 19

def apply_translates
  return if @translates_applied || !@values[:translated]

  @translates_applied = true

  columns = translated_columns_build
  return unless columns

  rel = unscoped.select(columns)
  rel.instance_variable_set(:@translates_applied, true)
  replace_plurals_in_projections
  @from_clause = Arel::Nodes::SqlLiteral.new(
    "(#{rel.arel.to_sql}) #{@klass.table_name}"
  )
end

#arel(aliases = nil) ⇒ Object



4
5
6
7
8
9
# File 'lib/from_clause_translate/active_record_relation.rb', line 4

def arel(aliases = nil)
  arel = super
  apply_translates
  arel.instance_variable_get(:@ctx).source.left = @from_clause if @from_clause
  arel
end

#perform_calculation(operation, column_name) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/from_clause_translate/active_record_relation.rb', line 41

def perform_calculation(operation, column_name)
  return super operation, column_name if @without_projections

  rel = spawn
  rel.instance_variable_set(:@without_projections, true)
  rel.add_translated_column column_name if column_name
  rel.perform_calculation operation, column_name
end

#replace_plurals_in_projectionsObject



50
51
52
53
54
55
56
57
58
# File 'lib/from_clause_translate/active_record_relation.rb', line 50

def replace_plurals_in_projections
  @arel.projections.each do |column|
    next unless column.is_a? String

    name = column[0] == '"' ? column[1...-1] : column
    plural = @klass._translation_data.plurals[name.to_sym]
    column.replace plural if plural
  end
end

#translated_columns_buildObject



35
36
37
38
39
# File 'lib/from_clause_translate/active_record_relation.rb', line 35

def translated_columns_build
  FromClauseTranslate::TranslatedColumnsBuilder.new(
    self, @klass, @without_projections
  ).perform
end