gpt4 book ai didi

ruby-on-rails - 具有 has_many 和 has_one 的多态关联的 Factory Girl

转载 作者:行者123 更新时间:2023-12-04 05:55:08 25 4
gpt4 key购买 nike

我目前正在做一个项目,我想使用 factory girl 创建测试,但我无法让它与多态 has_many 关联一起工作。我已经尝试了其他文章中提到的许多不同的可能性,但它仍然不起作用。我的模型如下所示:

class Restaurant < ActiveRecord::Base
has_one :address, as: :addressable, dependent: :destroy
has_many :contacts, as: :contactable, dependent: :destroy

accepts_nested_attributes_for :contacts, allow_destroy: true
accepts_nested_attributes_for :address, allow_destroy: true

validates :name, presence: true
#validates :address, presence: true
#validates :contacts, presence: true
end

class Address < ActiveRecord::Base
belongs_to :addressable, polymorphic: true

# other unimportant validations, address is created valid, the problem is not here
end

class Contact < ActiveRecord::Base
belongs_to :contactable, polymorphic: true
# validations ommitted, contacts are created valid
end

所以基本上我想为餐厅创建工厂,其中包含地址和联系人(验证餐厅是否存在,但如果不可能,即使没有它们),但我无法这样做。最终语法应该是这样的:

let(:restaurant) { FactoryGirl.create(:restaurant) }

这还应该创建关联的地址和联系人。我已经阅读了很多文章,但我总是会遇到某种错误。目前我的工厂(序列定义正确)是这样的:

factory :restaurant do
name
# address {FactoryGirl.create(:address, addressable: aaa)}
# contacts {FactoryGirl.create_list(:contact,4, contactable: aaa)}
# Validations are off, so this callback is possible
after(:create) do |rest|
# Rest has ID here
rest.address = create(:restaurant_address, addressable: rest)
rest.contacts = create_list(:contact,4, contactable: rest)
end
end

factory :restaurant_address, class: Address do
# other attributes filled from sequences...

association :addressable, factory: :restaurant
# addressable factory: restaurant
# association(:restaurant)
end

factory :contact do
contact_type
value

association :contactable, :factory => :restaurant
end

有没有一种方法可以在测试中使用一个命令创建带有地址和联系人集的餐厅?由于 after(:create) 回调,我真的需要摆脱我的验证吗?当前状态如下:

  1. 餐厅是用名称和 ID 创建的。
  2. 地址正在创建 - 一切都是正确的,它具有所有值,包括 addressable_id 和 addressable_type
  3. 在创建所有联系人之后,一切正常,cntacts 具有正确的值。
  4. 在那之后,餐厅没有任何来自关联对象的 ID,也没有与地址或联系人的关联
  5. 之后,出于某种原因再次构建餐厅(也许是为了添加这些关联?)但它失败了:我得到 ActiveRecord:RecordInvalid。

我使用的是 factory_girl_rails 4.3.0、ruby 1.9.3 和 rails 4.0.1。我很乐意提供任何帮助。

更新 1:

只是为了阐明我的目标,我希望能够使用一个命令在我的规范中创建餐厅,并能够访问关联的地址和联系人,这些地址和联系人应该在创建餐厅时创建。让我们忽略所有验证(我从一开始就在示例中将它们注释掉了)。当我使用 after(:build) 时,会创建第一家餐厅,然后创建地址,餐厅 ID 为 addressable_id,类名为 addressable_type。联系人也一样,都是正确的。问题是,那家餐厅不知道它们(它没有地址或联系人 ID),我无法从我想访问的餐厅访问它们。

最佳答案

经过真正彻底的搜索,我找到了答案 here - stackoverflow question .This answer也指向这个gist .主要是在 after(:build) 回调中建立关联,然后将它们保存在 after(:create) 回调中。所以它看起来像这样:

factory :restaurant do
name

trait :confirmed do
state 1
end

after(:build) do |restaurant|
restaurant.address = build(:restaurant_address, addressable: restaurant)
restaurant.contacts = build_list(:contact,4, contactable: restaurant)
end

after(:create) do |restaurant|
restaurant.contacts.each { |contact| contact.save! }
restaurant.address.save!
end
end

我的 rspec 中也有一个错误,因为我使用的是 before(:each) 回调而不是 before(:all)。我希望这个解决方案对某人有所帮助。

关于ruby-on-rails - 具有 has_many 和 has_one 的多态关联的 Factory Girl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com