method
prepare_update_statement
v8.1.1 -
Show latest stable
- Class:
Arel::Visitors::SQLite
prepare_update_statement(o)private
No documentation available.
# File activerecord/lib/arel/visitors/sqlite.rb, line 35
def prepare_update_statement(o)
# Sqlite need to be built with the SQLITE_ENABLE_UPDATE_DELETE_LIMIT compile-time option
# to support LIMIT/OFFSET/ORDER in UPDATE and DELETE statements.
if o.key && has_join_sources?(o) && !has_group_by_and_having?(o) && !has_limit_or_offset_or_orders?(o)
# Join clauses cannot reference the target table, so alias the
# updated table, place the entire relation in the FROM clause, and
# add a self-join (which requires the primary key)
stmt = o.clone
stmt.relation, stmt.wheres = o.relation.clone, o.wheres.clone
stmt.relation.right = [stmt.relation.left, *stmt.relation.right]
stmt.relation.left = stmt.relation.left.alias("__active_record_update_alias")
Array.wrap(o.key).each do |key|
stmt.wheres << key.eq(stmt.relation.left[key.name])
end
stmt
else
super
end
end