Ivan Nemytchenko's summary recommendation: models should be treated as domain models. Keep associations, business rules, state machines, and defaults inside; move persistence-level creation/edit/delete into mutators, business logic and external interactions into services, and scopes into a concern. Models should never expose IDs across layer boundaries; the only allowed place to pass an ID is when triggering a job (to avoid pushing a whole model into the job payload). No callbacks for defaults (use the constructor) or for calling external services (use a service + mutator).