Ruby on rails &引用;不能';“找不到”;错误ActiveRecord.new方法

Ruby on rails &引用;不能';“找不到”;错误ActiveRecord.new方法,ruby-on-rails,activerecord,has-many,belongs-to,Ruby On Rails,Activerecord,Has Many,Belongs To,我在5月份的Rails 3.0.3应用程序中遇到了这个问题,我认为这是一个愚蠢的错误,但我不明白为什么会发生这种情况,或者事实上,我误解了ActiveRecord的行为,这并不是一个真正的错误 这是一个场景,我有三个模型: class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :v

我在5月份的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
我面对错误

Couldn't find AddressBase with ID=10 for Address with ID= 对于ID为的地址,找不到ID为10的AddressBase= 这是因为AddressBase已经存在,而Address不存在,如果我删除hash的AddressBase.id参数,一切都会正常工作,但我不希望这样,因为这样,总是会为Address和AddressBase创建一个新的寄存器。我的意图是重用commons AddressBase,因此有必要使用现有AddressBase创建新地址

这就是我的疑问,我在AddressBase散列中遗漏了一些参数??比如说记录已经存在?或者这是ActiveRecord所属的多个关联的问题


提前感谢。

问题在于您无法在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"

})

谢谢@danny hiemstra!你的建议是我真正不想看到的。我现在只需要考虑如何构建视图来实现这种情况,因为问题有一些场景,一个是AddressBase已经存在,所以我将在哈希中传递address_base_id,第二个场景是AddressBase不存在,所以需要创建他,我需要在哈希中传递他所有的值,我会想办法解决这个问题。非常感谢。另外,您可能要做的是首先检查它是否存在,如果它确实使用hash.delete方法从params散列中删除了密钥,然后使用address\u base\u id向散列添加一个新值。我正在我的控制器中进行检查,我不再传递散列中的“id”,在控制器中,我检查数据库中是否已经存在带有给定邮政编码的AddressBase,如果为true,我只需直接设置引用
user.addresses.first.address\u base=address\u base\u from_database
(这只是一个片段),如果为false,我只需保存用户并创建地址和地址\u base。但我想要的是直接在视图中解决这个问题。当散列具有AddressBase的
id
时,为什么要使用rails呢?他试图查找地址寄存器,这是所属的常见行为?
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"