Generating ActiveRecord model table name to include namespace

I will implement this myself, looking for feedback on if it’d be accepted and how the community feels about the long term of this being enabled by default.

I often run into conflicts between table names when running multiple fairly heavyweight engines that all deal with e-commerce (and in turn many have tables such as most recently payments that conflict). The current solution is to manually specify the table prefix in the appropriate gem / module.

I am suggesting that we add a inherits_prefix_from_namespace flag to models, then eventually in the long term (perhaps rails 5) defaulting this to be enabled.

Ideally this would work as follows:

module Example
module Widgets
class Test < ActiveRecord::Base
inherits_table_prefix_from_namespace: true





Rather than having its table name be tests , the table name would be example_widgets_tests.

In the case that a prefix is specified, the table name would be prefix_example_widgets_tests (rather than prefix_tests).

Not sure I get what’s the actual difference between a new option like that and setting the table name prefix on the module, which will work for all classes under it? Can you expand on that a bit?


Suggesting that we can auto generate the prefix based on the module name, rather than setting it with the existing method. Then eventually this feels like a sensible default to me.

The first suggestion, as far as I understood, was related to something like inherits_table_prefix_from_namespace, which seems pretty much the same as setting the table name prefix.

In any case, I’ve seen many many cases where people organize their models in namespaces, but the tables might not have the namespace prefix. Making this a default would likely be a considerable breaking change, and I’m leaned to think it would be unnecessary overhead.


This will be a pretty rough default for some DBs that have short identifier maximums (Oracle is 30 characters).

We’d also need to be explicit about what happens with models that descend from namespaced classes (from an engine, for instance). IIRC, current behavior derives the table name for subclasses from the direct descendant of AR::Base.

—Matt Jones