我目前正在一个项目上工作,我想用工厂女孩创建测试,但我无法使它与多态has_many关联工作。我已经尝试了其他文章中提到的许多不同的可能性,但它仍然不起作用。我的模型是这样的:工厂女孩与has_many和has_one的多态关联
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
所以bassically我想创建一个工厂与地址和联系方式餐厅(与餐厅验证的存在,但如果它是不可能的,即使没有他们),但我不能这样做。最后的语法应该是这样的:
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
有没有一种方法来创建与地址和联系人测试一个命令餐厅设置?我真的需要摆脱我的验证,因为后(:创建)回调? 当前状态如下:
- 餐厅是使用名称和ID创建的。
- 比正在创建的地址 - 所有正确的,它具有包括addressable_id和addressable_type的所有值
- 之后,所有联系人正在创建,再次一切都很好,cntacts具有正确的值。
- 之后,餐厅没有任何关联对象的ID,没有关联地址或联系人
- 之后,由于某种原因餐厅再次建立(也许添加这些关联?),并且它失败了:我得到ActiveRecord的:RecordInvalid。
我使用的是factory_girl_rails 4.3.0,ruby 1.9.3和rails 4.0.1。我会很乐意提供任何帮助。
更新1:
只是为了澄清我的目标,我希望能够使用一个命令来创建我的规格餐厅和能够访问相关的地址和联系方式,这应该在创建创建的餐厅。让我们忽略所有的验证(我从一开始就让他们在我的例子中注释掉了)。当我在(:build)之后使用时,会创建第一家餐厅,地址是用餐厅ID创建的,地址为addressable_id,类名称为addressable_type。一切都是正确的。问题是,餐厅不知道他们(它没有地址或联系人的ID),我无法从我想要的餐厅访问它们。
谢谢您的时间,我已经更新了我的问题,请忽略所有的验证,我的目标就是要创建一个地址和联系方式的餐厅,应在规范餐饮访问。试图设置无可寻址地址没有帮助,地址和联系人刚创建时没有餐厅的身份证,因此该协会被打破得更多。 – Giron