method
prepare_update_statement
v7.1.3.4 -
Show latest stable
- Class:
Arel::Visitors::ToSql
prepare_update_statement(o)private
The default strategy for an UPDATE with joins is to use a subquery. This doesn’t work on MySQL (even when aliasing the tables), but MySQL allows using JOIN directly in an UPDATE statement, so in the MySQL visitor we redefine this to do that.
# File activerecord/lib/arel/visitors/to_sql.rb, line 927
def prepare_update_statement(o)
if o.key && (has_limit_or_offset_or_orders?(o) || has_join_sources?(o))
stmt = o.clone
stmt.limit = nil
stmt.offset = nil
stmt.orders = []
stmt.wheres = [Nodes::In.new(o.key, [build_subselect(o.key, o)])]
stmt.relation = o.relation.left if has_join_sources?(o)
stmt.groups = o.groups unless o.groups.empty?
stmt.havings = o.havings unless o.havings.empty?
stmt
else
o
end
end Related methods
- Instance methods
- compile
- Class methods
- new
- Private methods
-
aggregate -
bind_block -
build_subselect -
collect_ctes -
collect_nodes_for -
collect_optimizer_hints -
has_group_by_and_having? -
has_join_sources? -
has_limit_or_offset_or_orders? -
infix_value -
infix_value_with_paren -
inject_join -
is_distinct_from -
maybe_visit -
prepare_delete_statement -
prepare_update_statement -
quote -
quote_column_name -
quote_table_name -
sanitize_as_sql_comment -
unboundable? -
unsupported -
visit_ActiveModel_Attribute -
visit_ActiveSupport_Multibyte_Chars -
visit_ActiveSupport_StringInquirer -
visit_Arel_Attributes_Attribute -
visit_Arel_Nodes_And -
visit_Arel_Nodes_As -
visit_Arel_Nodes_Ascending -
visit_Arel_Nodes_Assignment -
visit_Arel_Nodes_Avg -
visit_Arel_Nodes_Between -
visit_Arel_Nodes_Bin -
visit_Arel_Nodes_BindParam -
visit_Arel_Nodes_BoundSqlLiteral -
visit_Arel_Nodes_Case -
visit_Arel_Nodes_Casted -
visit_Arel_Nodes_Comment -
visit_Arel_Nodes_Count -
visit_Arel_Nodes_Cte -
visit_Arel_Nodes_CurrentRow -
visit_Arel_Nodes_DeleteStatement -
visit_Arel_Nodes_Descending -
visit_Arel_Nodes_Distinct -
visit_Arel_Nodes_DistinctOn -
visit_Arel_Nodes_DoesNotMatch -
visit_Arel_Nodes_Else -
visit_Arel_Nodes_Equality -
visit_Arel_Nodes_Except -
visit_Arel_Nodes_Exists -
visit_Arel_Nodes_Extract -
visit_Arel_Nodes_False -
visit_Arel_Nodes_Filter -
visit_Arel_Nodes_Following -
visit_Arel_Nodes_Fragments -
visit_Arel_Nodes_FullOuterJoin -
visit_Arel_Nodes_GreaterThan -
visit_Arel_Nodes_GreaterThanOrEqual -
visit_Arel_Nodes_Group -
visit_Arel_Nodes_Grouping -
visit_Arel_Nodes_HomogeneousIn -
visit_Arel_Nodes_In -
visit_Arel_Nodes_InfixOperation -
visit_Arel_Nodes_InnerJoin -
visit_Arel_Nodes_InsertStatement -
visit_Arel_Nodes_Intersect -
visit_Arel_Nodes_IsDistinctFrom -
visit_Arel_Nodes_IsNotDistinctFrom -
visit_Arel_Nodes_JoinSource -
visit_Arel_Nodes_LessThan -
visit_Arel_Nodes_LessThanOrEqual -
visit_Arel_Nodes_Limit -
visit_Arel_Nodes_Lock -
visit_Arel_Nodes_Matches -
visit_Arel_Nodes_Max -
visit_Arel_Nodes_Min -
visit_Arel_Nodes_NamedFunction -
visit_Arel_Nodes_NamedWindow -
visit_Arel_Nodes_Not -
visit_Arel_Nodes_NotEqual -
visit_Arel_Nodes_NotIn -
visit_Arel_Nodes_NotRegexp -
visit_Arel_Nodes_NullsFirst -
visit_Arel_Nodes_NullsLast -
visit_Arel_Nodes_Offset -
visit_Arel_Nodes_On -
visit_Arel_Nodes_OptimizerHints -
visit_Arel_Nodes_Or -
visit_Arel_Nodes_OuterJoin -
visit_Arel_Nodes_Over -
visit_Arel_Nodes_Preceding -
visit_Arel_Nodes_Quoted -
visit_Arel_Nodes_Range -
visit_Arel_Nodes_Regexp -
visit_Arel_Nodes_RightOuterJoin -
visit_Arel_Nodes_Rows -
visit_Arel_Nodes_SelectCore -
visit_Arel_Nodes_SelectOptions -
visit_Arel_Nodes_SelectStatement -
visit_Arel_Nodes_SqlLiteral -
visit_Arel_Nodes_StringJoin -
visit_Arel_Nodes_Sum -
visit_Arel_Nodes_TableAlias -
visit_Arel_Nodes_True -
visit_Arel_Nodes_UnaryOperation -
visit_Arel_Nodes_Union -
visit_Arel_Nodes_UnionAll -
visit_Arel_Nodes_UnqualifiedColumn -
visit_Arel_Nodes_UpdateStatement -
visit_Arel_Nodes_ValuesList -
visit_Arel_Nodes_When -
visit_Arel_Nodes_Window -
visit_Arel_Nodes_With -
visit_Arel_Nodes_WithRecursive -
visit_Arel_SelectManager -
visit_Arel_Table -
visit_Array -
visit_BigDecimal -
visit_Class -
visit_Date -
visit_DateTime -
visit_FalseClass -
visit_Float -
visit_Hash -
visit_Integer -
visit_NilClass -
visit_Set -
visit_String -
visit_Symbol -
visit_Time -
visit_TrueClass