摘要的
City
有多个Locations
(HABTM关联),请创建这样的子记录:
a = Location.create(:name=>'Site 1', :city => City.create(:name=>'A City'))
问题: a.city_id
在重新加载之前无法在数据库中更改。例如:
a.city_id = 99
a.save # => true
a.city_id # => 11
详细
class City < ActiveRecord::Base
has_many :locations
end
class Location < ActiveRecord::Base
belongs_to :city
end
a = Location.create(:name=>'Site 1', :city => City.create(:name=>'A City'))
# Create a record manually for comparison
b = Location.create(:name=>a.name, :city_id=>a.city_id)
a.city_id = 99
a.save # => true
b.city_id = 99
b.save # => true
a.city_id # => 11
b.city_id # => 99
a
和b
在创作时看起来相同,但表现不同。虽然更改a
后city_id
显示为有效,但已成功保存,但city_id
未更改。
但是,如果记录a
在更改之前重新加载,则更改“有效”:
a = Location.create(:name=>'Site 1', :city => City.create(:name=>'A City'))
a.reload
a.city_id = 99
a.save
a.city_id # => 99
这似乎相当神秘,因为人们可以先创建父对象,但我发现使用FactoryGirl的问题,
factory :city do
name 'Jos'
end
factory :location do
name 'Site 1'
city { |a| a.association :city }
end
Factory(:location)显示具有不可更改:city_id
的相同行为,直到从数据库重新加载。我花了很长时间才弄清楚发生了什么,为什么我的测试失败了,因为没有像我预期的那样发生变化。
我从检查新的location
看到它包含一个完整的city
对象,而在重新加载之后却没有,所以这必须是一个线索,但究竟是什么发生在这里?期望FactoryGirl在返回之前自动重新加载对象是否合理,还是会破坏某些东西?当然我可以通过回调来做到这一点,但我对简单感兴趣。
(如果你想知道为什么我不只是说location.city = new_city
而不是location.city_id = 99
,那是因为我正在编写一个测试,并想创建带有无效引用的“孤儿”记录。)