Upgrading just code
If you're just upgrading the application code passenger should allow you to do that without skipping a beat. However it's not going to protect you if an upgrade goes wrong, for that you should consider having two or more load balanced web servers which you can upgrade individually round robin.
Upgrading the database
As a user I'd rather see a "down for maintenance" page than my browser spinning for 10 seconds. If you explain that the downtime will be an order of a few seconds and set the page to auto-refresh.
If you're adamant about having no downtime while doing db upgrades you have a few options:
You can refactor your database in such a way that you keep the old schema valid. This means you can keep two version of your app running against the same database and over time migrate to the new schema. There's a lot of 'database refactoring' articles, with most of them advocating using triggers/etc... to achieve the desired result. I personally think it's a lot of effort for not a lot of reward.
Depending on your application you might be heavily biased towards reads over writes, which means you can show a 'maintenance' page for uncached data while you upgrade the database (this is how facebook does their database upgrades). This is even more effective if lots of your data is stored in memcached or redis. Alternatively you can switch to a readonly database slave and disable any write actions.
I hope this helps!