In response to my uber patch for the OpenBase database adapter, DHH
mentioned that the intention for 2.0 was to pull most of the adapters
out into plugins so that development could continue outside of the
core. I think the end result is admirable - the core team doesn't
need to waste time applying patches for databases that they have no
means or inclination to install/use/test/etc. The core team should be
designing AR, and the adapter maintainers figure out what this means
for their specific database backend (understanding, of course, that AR
design can't occur in a bubble ... I don't mean to say that
implementation should not be a consideration in AR design decisions).
However, in thinking through the user experience I think there may be
an even better way.
If some adapters, say mysql and postgres, remain in core while the
rest become plugins, then we will create a discontinuity in the user
experience. For some databases, you need only to specify your adapter
in database.yml and you're good to go. For other databases, you'll
need to not only adjust database.yml, but also perform this extra step
of running script/plugin install ... Then there's the question of
matching adapter versions to versions of Rails.
But what if the adapters were bundled as RubyGems? After all,
installing the rails gem means installing the gems that comprise
rails. What if the gem for each of the adapters was listed as a
dependancy for rails? Then they would already be installed and
available to everybody using rails as a gem. When the database.yml
file is parsed, we can load the proper gem based on the adapter
setting. The adapters are not in the core, but they can all be
accessed without loading plugins. And, pardon me if my understanding
of RubyGems is demonstrated to be painfully lacking, but couldn't we
also say that a specific version of rails requires a certain version
of the adapter gem?
Of course, the elephant in the room is, what to do when rails is not
being run as a gem. How would this affect rails:freeze:edge?
Just my crazy idea for the day...