Rails3:无法在动态创建父项时首先重新加载记录时更新属性

时间:2011-04-02 06:50:54

标签: ruby-on-rails-3 testing associations factory-bot

摘要

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

ab在创作时看起来相同,但表现不同。虽然更改acity_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,那是因为我正在编写一个测试,并想创建带有无效引用的“孤儿”记录。)

0 个答案:

没有答案