【问题标题】:FactoryBot creating records + associated with a shared parentFactoryBot 创建记录 + 与共享父级关联
【发布时间】:2021-08-19 21:02:10
【问题描述】:

我有一个user,他拥有多个trackers。每个tracker 都属于一个名为trackable 的多态关联,它引用许多其他类之一。

以下是关系:

# User
has_many :trackers
has_many :dogs
has_many :cats
has_many :horses

# Tracker
belongs_to :user
belongs_to :trackable, polymorphic: true

# Dog, Cat, Horse, etc.
belongs_to :user
has_one :tracker, as: :trackable, dependent: :destroy

我想使用跟踪器工厂在 FactoryBot 中创建整个设置。

factory :tracker do
  user
  traits :dog do
    association :trackable, factory: :dog
  end
  traits :cat do
    association :trackable, factory: :cat
  end
  traits :horse do
    association :trackable, factory: :horse
  end

  after(:build) do |tracker|
    tracker.trackable.user = tracker.user
  end
end

上述内容似乎只有在我在 Tracker 中设置时才有效:belongs_to :user, optional: true。如果我使关系成为必需的,上面的代码就会失败。

如何修改上述代码,以便可以与 :dog 一起创建 Tracker,使两者都属于同一个用户?

【问题讨论】:

    标签: factory-bot


    【解决方案1】:

    这可能不是最优雅的方式,但确实有效。

    factory :tracker do
    
      trait :dog do
        user
        association :trackable, factory: :dog
      end
      trait :cat do
        user
        association :trackable, factory: :cat
      end
      trait :horse do
        user
        association :trackable, factory: :horse
      end
    
      after(:build) do |tracker|
        user = tracker.trackable.user
        tracker.user_id = user.id
      end
    end
    

    after(:build) 钩子触发之前,将用户添加到特征会立即创建关联的记录(例如狗)及其用户。现在已经建立了一个连接,剩下的唯一事情就是将跟踪器的用户设置为狗的用户,这是通过 tracker.user_id = user.id 完成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多