update_attributes не работает для вложенных атрибутов многие-ко-многим - PullRequest
0 голосов
/ 07 октября 2010

У меня есть некоторые вложенные атрибуты в некоторых моделях, такие как:

class Employee < ActiveRecord::Base
  has_one :user, :as => :user_role, :dependent => :destroy
  accepts_nested_attributes_for :user, :allow_destroy => true
end

class User < ActiveRecord::Base
  has_one :person, :as => :person_role, :dependent => :destroy
  belongs_to :user_role, :polymorphic => true
  accepts_nested_attributes_for :person, :allow_destroy => true
end

class Person < ActiveRecord::Base
  has_many :address_person_links, :dependent => :destroy
  has_many :addresses, :through => :address_person_links, :uniq => true, :dependent => :destroy

  belongs_to :person_role, :polymorphic => true

  accepts_nested_attributes_for :addresses, :allow_destroy => true
end

class AddressPersonLink < ActiveRecord::Base
  belongs_to :address
  belongs_to :person
end

class Address < ActiveRecord::Base
  has_many :address_person_links, :dependent => :destroy
  has_many :people, :through => :address_person_links, :uniq => true
end

, когда я звоню @employee.update_attributes(params[:employee]) с моего контроллера, он обновляет все , за исключением адреса.Однако, если я raise params.inspect и скопирую это в переменную в скрипте / консоли, это работает.Пример:

>> e = Employee.find(8)
=> #<Employee id: 8, active: true, admin: false, created_at: "2010-10-06 20:05:01", updated_at: "2010-10-06 20:11:20">
>>address = a.user.person.addresses[0]
=> #<Address id: 10, address1: "225 3rd Ave", address2: "", address3: "", city: "Sacramento", state_id: 5, zip_code: "95814", country_id: 1, contact_type_id: 2, created_at: "2010-10-06 20:05:01", updated_at: "2010-10-06 22:40:06">
>> params = {"commit"=>"Update",
?>  "_method"=>"put",
?>  "authenticity_token"=>"sYgfNDbt4SB00WSjJXnpF4FNhRT4HBHcY7W+IENpC/k=",
?>  "id"=>"8",
?>  "employee"=>{"user_attributes"=>{"person_attributes"=>{"addresses_attributes"=>{"0"=>{"address1"=>"225 3rd Ave Suite 777",
?>  "city"=>"Sacramento",
?>  "contact_type_id"=>"2",
?>  "address2"=>"",
?>  "address3"=>"",
?>  "zip_code"=>"95814",
?>  "country_id"=>"1",
?>  "id"=>"10",
?>  "state_id"=>"5"}},
?>  "prefix"=>"",
?>  "email_addresses_attributes"=>{"0"=>{"contact_type_id"=>"2",
?>  "id"=>"16",
?>  "email"=>"first@example.com"}},
?>  "id"=>"16",
?>  "last_name"=>"Last",
?>  "suffix"=>"",
?>  "phone_numbers_attributes"=>{"0"=>{"number"=>"9165555555",
?>  "contact_type_id"=>"1",
?>  "extension"=>"",
?>  "id"=>"16"}},
?>  "first_name"=>"First"},
?>  "password_confirmation"=>"321321",
?>  "id"=>"16",
?>  "password"=>"321321",
?>  "login"=>"third"},
?>  "admin"=>"0",
?>  "active"=>"1"}}
=> # this outputs the hash that was created
>> e.update_attributes(params["employee"]) # they are no longer symbols but string keys now
=> true
>> address
=> #<Address id: 10, address1: "225 3rd Ave Suite 777", address2: "", address3: "", city: "Sacramento", state_id: 5, zip_code: "95814", country_id: 1, contact_type_id: 2, created_at: "2010-10-06 20:05:01", updated_at: "2010-10-06 22:40:16">

Итак, вы можете видеть, что адрес был обновлен из скрипта / консоли, но не из моего контроллера.

Если это информационная перегрузкатогда простая версия этого вопроса:
Почему мой адрес не обновляется?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2011

У меня было тихое странное поведение по другой причине.В моей модели у меня было

accepts_nested_attributes_for :items, :allow_destroy => true, :reject_if => proc { |attrs| attrs['count'] == '0' || ( attrs['article_id'] == '' && attrs['quantity_id'] == '') }

Я удалил часть: reject_if, и она снова заработала.

0 голосов
/ 20 октября 2010

Я смог наконец-то взглянуть на эту проблему сегодня.Это было быстрое исправление, с которым я столкнулся, потому что имел дело с другой проблемой: адреса не удалялись, когда я удалял сотрудников, пользователей или людей.Исправление таково:

class AddressPersonLink < ActiveRecord::Base
  # some how adding dependent => destroy fixed the problem
  # i was having with updating as well.
  belongs_to :address, :dependent => :destroy
  belongs_to :person
end
...