“无法找到”错误ActiveRecord.new方法

时间:2011-02-22 16:34:50

标签: ruby-on-rails activerecord has-many belongs-to

我在may Rails 3.0.3应用程序中面对这个问题,我认为这是一个愚蠢的错误,但我无法弄清楚为什么会发生这种情况,或者事实上,我误解了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没有,如果我删除了hash的AddressBase.id参数一切正常,但我不想要它,因为这样,总会创建一个新的寄存器for Address和AddressBase。我的目的是重用commons AddressBase,因此需要使用现有AddressBase的新地址的场景。

现在这是我的疑惑,我在AddressBase哈希中缺少一些参数?有什么话说记录已经存在?或者这是ActiveRecord的belongs_to和has_many关联的问题?

提前致谢。

1 个答案:

答案 0 :(得分:1)

问题是你无法在rails模型中大量分配ID属性(将ID提供给初始化模型的数据哈希)。

我很难重现你的情况,但如果你知道模型存在,那么提供address_base的id更容易,而不是所有数据的散列。

例如:

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"

})