Ruby on rails “Contact has_many:Address”在检查:Contact是否存在时起作用,在Address中,但不使用:Contact_id(且未经验证)

Ruby on rails “Contact has_many:Address”在检查:Contact是否存在时起作用,在Address中,但不使用:Contact_id(且未经验证),ruby-on-rails,has-many,belongs-to,Ruby On Rails,Has Many,Belongs To,我真的很难找到这个问题,现在我知道出了什么问题,但不知道为什么,也不知道它是否是一个bug macbuech:iq josh$ ruby -v ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.4.0] macbuech:iq josh$ rails -v Rails 3.2.1 我有一个模型联系人,有很多地址。到目前为止,一切都很顺利,直到我决定验证Address.contact_id的存在,这似乎破坏了我的contact.A

我真的很难找到这个问题,现在我知道出了什么问题,但不知道为什么,也不知道它是否是一个bug

macbuech:iq josh$ ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.4.0]
macbuech:iq josh$ rails -v
Rails 3.2.1

我有一个模型联系人,有很多地址。到目前为止,一切都很顺利,直到我决定验证Address.contact_id的存在,这似乎破坏了我的contact.Address在这种情况下,我总是通过关联创建地址,即

c.addresses.create

那么,当您在contact_id上进行验证时,会发生什么情况呢?

这正如预期的那样工作,但我真的很想知道为什么我的代码会这样,因为我怀疑这可能是一个bug或其他什么,或者,如果不是,有什么解释。
1.9.3p0 :001 > c = FactoryGirl.create :contact
 => #<Contact id: 71, corporate: false, companyname: nil, firstname: nil, middlename: nil, lastname: "Doe", initials: nil, nickname: nil, gender: "male", title: nil, profession: nil, department: nil, birthday: nil, spouse: nil, kids: nil, superior: nil, assistant: nil, contacttype_id: 71, language_id: nil> 
1.9.3p0 :002 > a = FactoryGirl.create :address
 => #<Address id: 63, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 72, addresstype_id: 63, country_id: 63> 
1.9.3p0 :003 > c.addresses
 => [] 
1.9.3p0 :004 > c.addresses << a
 => [#<Address id: 63, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 71, addresstype_id: 63, country_id: 63>] 
1.9.3p0 :005 > c.addresses
 => [#<Address id: 63, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 71, addresstype_id: 63, country_id: 63>] 
1.9.3p0 :006 > c.save!
 => true 
1.9.3p0 :007 > c.reload
1.9.3p0 :008 > c.addresses
 => [#<Address id: 63, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: "8088", province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 71, addresstype_id: 63, country_id: 63>]     
class Address < ActiveRecord::Base
  belongs_to :contact
  validates :contact_id, :presence => true
  # ...
end
1.9.3p0 :009 > c = FactoryGirl.create :contact
 => #<Contact id: 84, corporate: false, companyname: nil, firstname: nil, middlename: nil, lastname: "Doe", initials: nil, nickname: nil, gender: "male", title: nil, profession: nil, department: nil, birthday: nil, spouse: nil, kids: nil, superior: nil, assistant: nil, contacttype_id: 84, language_id: nil> 
1.9.3p0 :010 > a = FactoryGirl.create :address
 => #<Address id: 74, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 85, addresstype_id: 74, country_id: 74> 
1.9.3p0 :011 > c.addresses
 => [] 
1.9.3p0 :012 > c.addresses << a
 => [#<Address id: 74, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 85, addresstype_id: 74, country_id: 74>] 
1.9.3p0 :013 > c.addresses
 => [#<Address id: 74, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 85, addresstype_id: 74, country_id: 74>] 
 => true 
1.9.3p0 :015 > c.reload
 => #<Contact id: 84, corporate: false, companyname: nil, firstname: nil, middlename: nil, lastname: "Doe", initials: nil, nickname: nil, gender: "male", title: nil, profession: nil, department: nil, birthday: nil, spouse: nil, kids: nil, superior: nil, assistant: nil, contacttype_id: 84, language_id: nil> 
1.9.3p0 :016 > c.addresses
 => [] 
1.9.3p0 :009 > c = FactoryGirl.create :contact
 => #<Contact id: 97, corporate: false, companyname: nil, firstname: nil, middlename: nil, lastname: "Doe", initials: nil, nickname: nil, gender: "male", title: nil, profession: nil, department: nil, birthday: nil, spouse: nil, kids: nil, superior: nil, assistant: nil, contacttype_id: 97, language_id: nil> 
1.9.3p0 :010 > a = FactoryGirl.create :address
 => #<Address id: 85, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 98, addresstype_id: 85, country_id: 85> 
1.9.3p0 :011 > c.addresses
 => [] 
1.9.3p0 :012 > c.addresses << a
 => [#<Address id: 85, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 98, addresstype_id: 85, country_id: 85>] 
1.9.3p0 :013 > c.addresses
 => [#<Address id: 85, active: true, standard: false, street: "Mustergasse 123", extraline1: nil, extraline2: nil, city: "Musterhausen", zip: 8088, province: nil, pobox: nil, latitude: nil, longitude: nil, validfrom: nil, validto: nil, label: nil, description: nil, contact_id: 98, addresstype_id: 85, country_id: 85>] 
1.9.3p0 :014 > c.save!
 => true 
1.9.3p0 :015 > c.reload
 => #<Contact id: 97, corporate: false, companyname: nil, firstname: nil, middlename: nil, lastname: "Doe", initials: nil, nickname: nil, gender: "male", title: nil, profession: nil, department: nil, birthday: nil, spouse: nil, kids: nil, superior: nil, assistant: nil, contacttype_id: 97, language_id: nil> 
1.9.3p0 :016 > c.addresses
 => [] 
let (:contact) do
  contact = create(:contact)
  contact.addresses << create(:address)
  contact
end
let (:contact) do
  contact = create(:contact)
  contact.addresses << create(:address, :contact => contact)
  contact
end
c.addresses.create