many_to_many
is all about hiding the join table. In this use case, as far as I understand, a precise management of data in the join table is required and direct access to the other table (roles) is primarily for reading - that’s the use case of has_many through:
.
In general, though, I personally find many_to_many
not that useful and almost always go for has_many through
. It gives me more control and with Ecto.Multi
is not that much more code to do inserts and similar manually.