2011-02-22 29 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