You’ve got Employees and Departments. Each Employee has one Department, each Department has many Employees. Very many. Let’s say thousands, or even tens of thousands.
So you want to create a new Employee and assign it to a Department.
dept = Department.find_existing_dept_somehow() # existing one fetched from db
employee = Employee.createAndInit() # newly created not yet saved
Now you have two choices
1: departments << employee
2: employee.department = department
Either way you end with: employee.save!
Those might look equivelent, but I think the first ends up being a huge performance problem. I believe that is because the first call will end up requiring a fetch of all the department’s employees (thousands or more), before adding the new employee to it–and possibly doing an implicit save of one or more object too. While the second never forces the potentially expensive fetching of all the department’s employees. But I’m just guessing here. All I know is that when I changed the #1 style to the #2 style, I just erased one mysterious performance hit in my app.