Class: Arel::Visitors::ToSql

Inherits:
Visitor
  • Object
show all
Defined in:
lib/delta_attributes3_2/to_sql.rb

Direct Known Subclasses

MySQL

Instance Method Summary collapse

Methods inherited from Visitor

#visit_with_delta_attribute

Instance Method Details

#visit_Arel_Nodes_Assignment_with_deltas(o) ⇒ Object Also known as: visit_Arel_Nodes_Assignment



5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/delta_attributes3_2/to_sql.rb', line 5

def visit_Arel_Nodes_Assignment_with_deltas o
  return visit_Arel_Nodes_Assignment_without_deltas o unless o.is_a?(Arel::Nodes::DeltaAttribute)
  return visit_Arel_Nodes_Assignment_without_deltas o.arel_node unless o.valid?

  old_value = o.old_value
  new_value = o.new_value

  delta_string = "#{visit o.arel_node.left} "
  delta_string << (old_value > new_value ? "-" : "+")
  delta_string << " #{(old_value - new_value).abs}"

  "#{visit o.arel_node.left} = #{delta_string}"
end

#visit_Arel_Nodes_UpdateStatement(o) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/delta_attributes3_2/to_sql.rb', line 22

def visit_Arel_Nodes_UpdateStatement o
  if o.orders.empty? && o.limit.nil?
    wheres = o.wheres
  else
    key = o.key
    unless key
      warn(<<-eowarn) if $VERBOSE
(#{caller.first}) Using UpdateManager without setting UpdateManager#key is
deprecated and support will be removed in ARel 4.0.0.  Please set the primary
key on UpdateManager using UpdateManager#key=
      eowarn
      key = o.relation.primary_key
    end

    wheres = [Nodes::In.new(key, [build_subselect(key, o)])]
  end

  [
    "UPDATE #{visit o.relation}",
    ("SET #{o.values_changed.map { |value| visit value }.join ', '}" unless o.values_changed.empty?),
    ("WHERE #{wheres.map { |x| visit x }.join ' AND '}" unless wheres.empty?),
  ].compact.join ' '
end