diff --git a/activerecord/lib/active_record/locking/optimistic.rb b/activerecord/lib/active_record/locking/optimistic.rb index ced694ba9ab1e274a1c24ee3badea07c573ebbcc..eb0bcff7402addc768ec2773605c501e02d07d8d 100644 --- a/activerecord/lib/active_record/locking/optimistic.rb +++ b/activerecord/lib/active_record/locking/optimistic.rb @@ -80,10 +80,18 @@ def _update_record(attribute_names = self.attribute_names) #:nodoc: begin relation = self.class.unscoped - stmt = relation.where( - relation.table[self.class.primary_key].eq(id).and( - relation.table[lock_col].eq(self.class.quote_value(previous_lock_value, column_for_attribute(lock_col))) + # FIXME: Remove the Arel::Nodes::Quoted when we remove type casting + # from Arel (Rails 5.1) + quoted_lock_value = Arel::Nodes::Quoted.new( + self.class.quote_value( + previous_lock_value, + column_for_attribute(lock_col), ) + ) + quoted_id = Arel::Nodes::Quoted.new(id) + stmt = relation.where( + relation.table[self.class.primary_key].eq(quoted_id).and( + relation.table[lock_col].eq(quoted_lock_value)) ).arel.compile_update( arel_attributes_with_values_for_update(attribute_names), self.class.primary_key