Изменение массивов ассоциаций на клонированных объектах ActiveRecord - PullRequest
1 голос
/ 30 мая 2010

У меня есть класс модели ActiveRecord Foo, имеющий has_many Bar. Я хочу клонировать Foo (чтобы получить дубликаты большинства его атрибутов), а затем изменить его экземпляры Bar.

Это проблема, потому что клонированные экземпляры ActiveRecord совместно используют один и тот же связанный массив; изменения одного влияют на другое.

f1 = Foo.new
b = Bar.new
f1.bars << b
f2 = f1.clone
f2.bars.includes? b    # true
f1.bars.clear
f2.bars.includes? b    # now false

Реальная проблема в том, что я не могу отсоединить массивы баров от Foo:

f1.bars << b
f2.bars.includes? b    # true
f2.bars = []
f2.bars.includes? b    # now false
f1.bars.includes? b    # now also false

Если бы я мог сделать это, то я мог бы заменить Бары, как я хотел. Однако любое изменение одного Foo, похоже, влияет на другое.

Примечание: я работаю на Rails 3 Beta 2; это может быть фактором здесь.

Обновление

Похоже, это может быть ошибка в Rails 3; Я создал отчет об ошибке здесь .

1 Ответ

2 голосов
/ 30 мая 2010
u = User.first
u.tickets.size # 12
u2 = u.clone
u2.tickets = u.tickets
u2.tickets.pop
u2.tickets.size # 11    
u.tickets.size  # 12

так, у вас и u2 теперь разные массивы билетов

...