«Не удалось найти» Ошибка ActiveRecord.new метод - PullRequest
2 голосов
/ 22 февраля 2011

Я столкнулся с этой проблемой в мае Rails 3.0.3 App, я думаю, что это глупая ошибка, но я не могу понять, почему это происходит, или на самом деле, я неправильно понимаю поведение ActiveRecord, и это не совсем ошибка.

Это сценарий, у меня есть три модели:


class User < ActiveRecord::Base  
    devise :database_authenticatable, :registerable,
    :recoverable, :rememberable, :trackable, :validatable  
    has_many :addresses, :as => :addressable  
    accepts_nested_attributes_for :addresses  
end

class Address < ActiveRecord::Base  
  belongs_to :addressable, :polymorphic => true  
  belongs_to :address_base  
  accepts_nested_attributes_for :address_base  
end  

class AddressBase < ActiveRecord::Base  
  has_many :address  
end

Если я пытаюсь создать экземпляр нового Пользователя, передающего параметры хеша, таким образом:


User.new({"addresses_attributes"=>  
    {"0"=>
        {"number"=>"10",
         "complement"=>"Next Starbucks",
         "address_base_attributes"=>
            {"city"=>"San Francisco",
             "zip_code"=>"00010",
             "district"=>"San Francisco",
             "id"=>"10",
             "street"=>"Market St.",
             "state"=>"CA"}
        }
    },
    "name"=>"Homer Simpson",
    "password_confirmation"=>"[FILTERED]",
    "document"=>"123321111",
    "password"=>"[FILTERED]",
    "email"=>"homer@simpson.com"
})

Я сталкиваюсь с ошибкой

Couldn't find AddressBase with ID=10 for Address with ID=

И это происходит потому, что AddressBase уже существует, а Address не существует, если я удаляю параметр AddressBase.id из хэша, все работает, но я этого не хочу, потому что на этом пути всегда будет создаваться новый регистр для адреса и адресной базы. Мое намерение состоит в том, чтобы повторно использовать общие AddressBase, поэтому сценарий нового Address с существующей AddressBase будет необходим.

Теперь это мои сомнения, мне не хватает какого-то параметра в хэше AddressBase ?? Что-то вроде того, чтобы сказать, что запись уже существует? Или это проблема с ассоциациями own_to и has_many ActiveRecord?

Заранее спасибо.

1 Ответ

1 голос
/ 22 февраля 2011

Проблема в том, что вы не можете массово назначить атрибут ID в моделях рельсов (присвойте идентификатор хэшу данных, с которым вы инициализируете модель).

Мне сложно воспроизвести вашу ситуацию, но если вы знаете, что модель существует, проще указать идентификатор address_base вместо хеша со всеми данными.

Например:

User.new({"addresses_attributes"=>  
  {"0"=>
      {"number"=>"10",
       "complement"=>"Next Starbucks",
       "address_base_id" => 10}
  },
  "name"=>"Homer Simpson",
  "password_confirmation"=>"[FILTERED]",
  "document"=>"123321111",
  "password"=>"[FILTERED]",
  "email"=>"homer@simpson.com"

})

...