Чтобы вернуть существующие объекты, когда это возможно, вместо создания новых, ActiveRecord должен был бы отслеживать, какие объекты были созданы и на какую запись в базе данных они отвечают, что может быть связано с дополнительными затратами. Даже тогда ему все равно пришлось бы искать child.parent в базе данных, чтобы знать, что это та же самая запись, которую представляет @father, так что не было бы никакого существенного выигрыша в производительности от этого кеширования (хорошо, на стороне ruby он экономит, выделяя несколько объекты, но за счет затрат на бухгалтерию, но на стороне базы данных это должно быть в основном то же самое).
Таким образом, учитывая, что сотрудники AR, вероятно, решили, что предотвращение различных объектов, соответствующих одной и той же записи в базе данных, будет либо вредным, либо, по крайней мере, не стоит затраченных усилий, поэтому они решили не делать этого.