2011-02-22 75 views
2

我在這個問題可能在Rails 3.0.3應用程序,我認爲這是一個愚蠢的錯誤,但我無法弄清楚它爲什麼發生,或者事實上,誤解了ActiveRecord的行爲,這不是一個真正的錯誤。「找不到」錯誤ActiveRecord.new方法

這是該方案,我有三種模式:


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"=>"[email protected]" 
}) 

我面對錯誤

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

而這種情況發生的原因是AddressBase已經存在,並且地址沒有,如果我刪除了AddressB hash的ase.id參數一切正常,但我不想要它,因爲在這種方式下,總是會爲Address和AddressBase創建一個新的寄存器。我的意圖是重用commons AddressBase's,所以需要一個帶有現有AddressBase的新地址的場景。

現在,這是我的疑惑,我在AddressBase哈希中缺少一些參數?有人說這個記錄已經存在?或者它與ActiveRecord的belongs_to和has_many關聯有問題?

在此先感謝。

回答

1

問題是,您無法在rails模型中批量分配ID屬性(將ID賦予您用來初始化模型的數據散列)。

我很難再現你的情況,但如果你知道模型存在,那麼提供address_base的id代替所有數據的hash值會更容易。

例如:

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"=>"[email protected]" 

})

+0

感謝@丹尼 - hiemstra!你提出的是我無法真正看到的。我現在只需要考慮如何構建視圖來完成這種情況,因爲這個問題有一些場景,一個是AddressBase已經存在,所以我將只傳遞hash中的address_base_id,第二個場景是當AddressBase don不存在,所以他需要被創建,我需要將所有他的值傳遞給哈希,我會試着找出如何做到這一點。非常感謝你。 – avaz 2011-02-22 19:51:41