作为简化视图,我有以下模型:
class LineItem
belongs_to :service, polymorphic: true
belongs_to :line_item_template, optional: true
end
class LineItemTemplate
belongs_to :service, polymorphic: true
has_many :line_items
end
class ServiceOne
has_many :line_items, as: :service
has_many :line_item_templates, as: :service
after_create :create_line_item_templates
def create_line_item_templates
# ...
end
end
class ServiceTwo
has_many :line_items, as: :service
has_many :line_item_templates, as: :service
after_create :create_line_item_templates
def create_line_item_templates
# ...
end
end
因此,在创建ServiceOne
或ServiceTwo
的实例后,会创建相应的line_item_templates
并将其链接到该服务。
请务必注意line_item_templates
中的LineItem
关联是可选的。
我想创建一个工厂,创建一个LineItem
链接到新创建的ServiceOne
,但也链接到LineItemTemplate
回调中创建的ServiceOne#after_create
。
我正在尝试实现但未能正常工作的伪代码如下:
FactoryGirl.define do
factory :line_item
service {|t| t.association :service_one}
line_item_template_id self.services.first.line_item_templates.first.id
end
end
如何在工厂中实现这一目标?
答案 0 :(得分:0)
我确信有更好的方法可以做到这一点,但我提出的解决方案如下:
使用after(:build)
回调对我的各种测试至关重要,因为这意味着无论使用FactoryGirl.build
还是FactoryGirl.create
,它都会
FactoryGirl.define do
factory :line_item do
sequence(:description) {|n| "Line Item #{n}"}
service {|t| t.association :service_one}
end
factory :service_one_line_item, parent: :line_item do
after(:build) do |li|
li.line_item_template_id = li.service.line_item_templates.first.id
end
end
factory :service_two_line_item, parent: :line_item do
after(:build) do |li|
li.service = FactoryGirl.create(:service_two)
li.line_item_template_id = li.service.line_item_templates.first.id
end
end
end