Cheap many to many

There are two common ways to establish a many-to-many relationship:

  1. has_and_belongs_to_many

  2. has_many, :through

Both require a join table, and the second requires a little more setup than the first bit is more future-proof.

A third alternative is so simple it sounds dumb: simply add a JSON column to the parent that contains an array of child IDs. If you understand the constraints of this approach and your use case doesn't need them, it can be a flexible and noncommittal way to model relationships.


  • No guarantee of data integrity (can have orphaned IDs, no dependent: destroy, etc.).

  • Cannot access list of parents from child (can't see who a model belongs to).

  • Worse performance (or, at least, unmanaged performance).


  • Very noncommittal. When working with uncertainty, it's good to be as flexible as possible until you are sure of requirements. Creating a table is very committal.

  • Automatic transactions. Simply update the parent record without needing to worry about data inconsistency.

  • Can easily migrate to a true join-table based relationship.