奇怪的ActiveRecord :: AssociationTypeMismatch

Zar*_*doz 30 ruby ruby-on-rails

运行规范时出现一个非常奇怪的错误:

Failure/Error: entity = Factory.create(:entity, :name => "Test Entity", :creator => user)
 ActiveRecord::AssociationTypeMismatch:
   ::User(#97318850) expected, got User(#92770800)
Run Code Online (Sandbox Code Playgroud)

这是导致上述错误的代码.工厂是factory_girl工厂.

  user = Factory(:user, :username => "kai", :email => "xxx@yyy.com", :password => "testing")
  entity = Factory.create(:entity, :name => "Test Entity", :creator => user)
Run Code Online (Sandbox Code Playgroud)

当我使用时,:creator => User.first一切都按预期工作.我打印出来User.firstuser,但看不出有什么差别.

有什么建议到底有什么不对吗?

更新

运行这个简单的请求规范时,我也遇到了这个错误

describe "Entities" do
  it "should succeed" do
    entity = Factory.create(:entity, :name => "Test Entity 1")
    visit root_path
  end

  it "should also succeed" do
    entity = Factory.create(:entity, :name => "Test Entity 2")
    property = Factory.create(:property, :entity => entity)
  end
end
Run Code Online (Sandbox Code Playgroud)

这次我得到了

Failure/Error: property = Factory.create(:property, :entity => entity)
 ActiveRecord::AssociationTypeMismatch:
   Entity(#103620190) expected, got Entity(#96047070)
Run Code Online (Sandbox Code Playgroud)

当我删除visit root_path一切正常(也是在自己运行每个规范时).这似乎是请求规范的问题.其他规格(型号,控制器)似乎运行良好.我使用Capybara 1.0.0.beta1和RSpec 2.5.

这个数字背后的数字是什么意思?

Mat*_*chu 55

这是在加载了两个不同版本的模型时发生的错误.我曾经在较旧版本的Rails 3中使用它,因为开发环境的模型重新加载器略微出现了问题.类名后面的数字指的是该类的不同版本.

理所当然,这种错误可能会在开发模式中出现,但它不应该在测试模式下,因为默认情况下会缓存类.请参阅该config/environments/test.rb文件以确保cache_classes设置为true.

另请检查您使用的是最新版本的Rails 3.0.7.这可能是一个已修复的错误.当我们在这时,检查你是否在factory_girl 1.3.3.当我完全正确地使用API​​时,我认为你正在做的事情,剩下的唯一可能性是某些东西配置错误或者是别人的代码中的错误.

  • 使用`reload!`后,我在控制台中遇到了同样的问题.退出和启动控制台解决了这个问题.所以`reload!`也有类缓存的一些问题.(使用导轨4) (2认同)

Mat*_*att 5

而不是禁用在开发过程中可能会加重的类缓存,如果在使用之前让对象保持新鲜,问题可能会消失.在我的情况下,我正在从一个协会加载一个对象:

desired_object = foo.bar
Run Code Online (Sandbox Code Playgroud)

找到该项目而不是删除问题,并且不需要缓存类.

desired_object = Bar.find(foo.bar_id)
Run Code Online (Sandbox Code Playgroud)

我知道这不太理想,但也许这会帮助别人找出它为什么会发生的事情.

  • 我通过在关联后调用对象上的`.reload`来破解这个问题,就像在'foo.bar.reload`中一样 (2认同)