When I had this concern some months ago, the advice that I found was this:
if the callback directly affects the model (e.g., hashing the user's
password), declare it in the model; if the callback uses the model to do
something else (e.g., log the fact that the user was changed from active to
inactive), declare it in an observer. This rule of thumb has worked very
well for me.
I would rather see modules used to give a home to commonly used code instead
of to house code for a model that seemed like it was becoming to large. If
you have that sense about your model, consider the possibility that it
simply does carry that much responsibility in its domain, or it's carrying
too much responsibility and the design of the domain should be reconsidered.
Using modules to just move code around feels like the wrong approach to good
My preference is to leave stuff in the model file; as I said, I think
model files can usually handle growth very gracefully. I like your
observer rule of thumb. But I don't entirely agree with what you're
saying about modules. Modules are of course great for reusable code,
but if there's a bunch of functionality that seems like a good
candidate for a module, but only one class is going to use it, I don't
like to penalize that class for being the only user of the module by
refusing to create the module. I'd say the same thing about a partial
template, and most other modularizing tools.
Similarly, while I definitely don't advocate using modules just to
shorten a file (e.g., throw the last 50 lines in a module called
"ClutterFree"), I don't think modules are a danger sign, in terms of
design, if there's a rationale for what goes into the module. The
questions of whether the model aligns correctly with the domain and
whether the domain needs reworking can arise even in the case of very
short model files (like, two lines long and on the other side I
can imagine a model loading modules that make perfect sense for what
it's doing. So I'd tend to decouple the well-designed-domain question
from the does-a-model-load-modules? question.