【问题标题】:factory_girl_rails: factory built model instance's has_many association not populated when an associated child is createdfactory_girl_rails:工厂构建模型实例的 has_many 关联在创建关联子项时未填充
【发布时间】:2011-06-25 02:29:14
【问题描述】:

我正在使用factory_girl_rails 而不是固定装置。这是我的模型:

class User < ActiveRecord::Base
  has_many :tasks
  belongs_to :project
end

class Task < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end

class Project < ActiveRecord::Base
  has_many :users
  has_many :tasks
end

这是相关的工厂:

Factory.define :task do |t|
  t.association :user
  t.association :project
  t.after_create {|t| t.user.tasks << t}
  t.after_create {|t| t.project.tasks << t}
end

在集成测试中我这样做:

scenario "user with tasks from one project is assigned another task from the same project" do
  user = Factory.create :user
  (1..5).each { Factory.create(:task, :user => user, :project => user.project)}
  visit_project_path user.project
  correctly_fill_in_new_task_fields
  click_button "Create task" #creates a new task for the above user
  assert user.tasks.size == 6 #currently fails
end

我遇到的问题是在场景运行user.tasks.size == 5 之后,但是Task.where(:user_id =&gt; user.id).size == 6。如有任何帮助,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    实际上,这更有可能是由于 ActiveRecord 的工作方式。您的控制器从数据库中获取用户并创建用户的新实例。现在您的控制器和您的测试引用了两个不同的用户,这就是为什么您的测试永远不会看到更改。

    您需要在user 上致电reload,然后再检查有多少任务。

    旁注:一些 ORM 提供了一个身份映射(特殊类型的注册表)来解决这个问题(实际上......一个快速的谷歌似乎表明 Rails 3 最近在源中添加了一个身份映射。我没有不使用 AR,所以不确定如何启用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多