I have an ActiveRecord based application that is used via command line utilities. Having the models namespaced in such an application is advantageous for keeping the Object namespace clean.
I’m starting to build a rails application around these ActiveRecord models and, though I have overcome some of my initial troubles with using models in a namespace, I’m finding things are more verbose than I’d like.
What I want is to programmaticaly set a namespace for my ActiveRecord classes when used in the command line utilities and to programmaticaly not set a namespace for these models when used in the Rails app.
I know that the files themselves could be altered at runtime before being required, but I’m looking for something in the Ruby language itself to accomplish this cleanly.
hard to offer a great suggestion without seeing some code, but here are two possibilities.
It sounds like you have two clients for this code. Maybe make it an engine (just a fancy gem), you can add your paths to autoload paths, then use it from the gem without all the railsy crap getting in the way.
Maybe create a constant then reopen it in the models:
in some initializer
in your model file
Then for your command line app
Which is the same as not having a namespace:
Now you might wind up having difficulties with some of the Rails magic, which is largely based on reflection. I don’t totally know what you’ll face, but I’d expect forms to start generating the wrong keys when submitting data. You can probably fix this by defining something
DynamicNamespace.nameor something along those lines.Autoloading, is likely to also become an issue, but I think you can declare autoload paths somehow (I don’t know for sure, but googling “rails autoloading” gives some promising results, looks like it just hooks into Ruby’s autoloading — though I think this is going away in Ruby 2.0) worst case, you can probably define a railtie to eager load the dirs for you. This is all a bit out of my league, but I’d assume you need the railties defined before the app is initialized, so you may need to require the railtie in config/application.rb
Unfortunately, at the end of the day, when you start deviating from Rails conventions, life starts getting hard, and all that magic you never had to think about breaks down so you suddenly have to go diving into the Rails codebase to figure out what it was doing.