The Active Record Bargain
Active Record is a pattern where a database row becomes an object, and that object knows how to save, load, and update itself. Many frameworks ship it as the default way to talk to a database. You define a model, and the rest comes for free. Prototyping feels like a superpower.
The bill arrives as the system grows. Because your database schema maps one-to-one to your application code, the framework assumes any part of the codebase can read or write any attribute at any time. When you need to enforce a business rule—this field becomes read-only after the status changes—there's nowhere obvious to put it. So it ends up in a service here, a controller there, wherever the current developer thought it made sense.
Over time, your models become dumb data containers—they hold values but own no behavior. Your UI couples directly to your schema. Change a column name, break a form three layers away.
For simple scripts and early prototypes, that bargain makes sense—speed matters more than structure. But for complex systems with evolving rules, the price compounds. The thing that got you moving fast becomes the thing that won't let you change direction.