Вложенные атрибуты не обновляются - PullRequest
2 голосов
/ 08 июня 2011

Для следующих моделей:

class Location < ActiveRecord::Base
  has_many        :group_locations
  has_many        :groups, :through => :group_locations
  accepts_nested_attributes_for :group_locations
end

class GroupLocation < ActiveRecord::Base
  belongs_to  :group
  belongs_to  :location
end

class Group < ActiveRecord::Base
  has_many        :group_locations
  has_many        :locations, :through => :group_locations
end

следующие команды в консоли rails не обновляют связанные записи:

>> l = Location.find(1)
=> #<Location id: 1, phone: "(949) 788-9999", ... created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-07 23:57:32">

\>\> l.group_locations
=> [#<GroupLocation group_id: 4, location_id: 1, created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-02 00:58:07">, #<GroupLocation group_id: **37**, location_id: 1,
created_at: "2011-06-02 00:58:07", updated_at: "2011-06-02 00:58:07">]

>> l.update_attributes(:phone => "(949) 788-9998", :group_locations_attributes =>
[{:group_id => 4, :location_id => 1}, {:group_id => **38**, :location_id => 1}])
=> true

>> l
=> #<Location id: 1, phone: "(949) 788-9998", ... created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-08 02:05:00">

>> l.group_locations
=> [#<GroupLocation group_id: 4, location_id: 1, created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-02 00:58:07">, #<GroupLocation group_id: **37**, location_id: 1,
created_at: "2011-06-02 00:58:07", updated_at: "2011-06-02 00:58:07">]

Обратите внимание, что вызов update_attributes пытается изменить второй GroupLocationиметь group_id = 38, но изменение не производится (даже если номер телефона изменился).После просмотра кода, сгенерированного, когда это было реализовано в контроллере, и просмотра, изменение массива на хеш (то есть то, что создается в этом случае) не приводит к разным результатам (и форма / контроллер) имеют тот же эффект, что не обновлениесвязанные записи, хотя основная запись обновляется.

Есть идеи, что мне нужно сделать, чтобы обновить вложенные атрибуты?

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Из журналов, которые вы отобразили, не похоже, что ваша модель GroupLocation имеет первичный ключ: id. В то время как таблица соединения для HABTM содержит только внешние ключи (group_id, location_id), модель, используемая для ассоциации has_many: through, также нуждается в первичном ключе: по умолчанию: id. В противном случае невозможно определить, какой из дочерних объектов нужно обновить в случае обновления.

Подумайте об этом так: вы создаете свою ассоциацию с помощью другой дискретной модели, которая должна быть способной стоять полностью самостоятельно.

Соглашение для вложенных атрибутов заключается в том, что если хеш, переданный nested_attributes, включает в себя: id, то он считается обновлением, если нет, то считается созданным. В вашем случае вы не передаете: id, поэтому вы получаете новые записи GroupLocation, в которые вы просто хотели обновить существующие.

Я также считаю, что, как только вы правильно это сделаете, вы сможете избавиться от attr_accessible, я не думаю, что это необходимо.

Для получения подробной информации о функциональности вложенных атрибутов, которая охватывает большую часть этого, проверьте эту страницу .

0 голосов
/ 26 июня 2011

Фактический ответ заключается в том, что вложенные атрибуты должны быть доступны через attr_accessible. «accepts_nested_attributes» будет делать то, что я хочу, только если оно сопровождается «attr_accessible: group_locations» .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...