2012-05-03 22 views
24

Tôi muốn chuyển một tham số vào một nhà máy sẽ được sử dụng để đặt thuộc tính trên mô hình được liên kết. Mô hình liên quan được tạo trong nhà máy.Tham số truyền trong thuộc tính thiết lập liên kết trong FactoryGirl

Tôi có mô hình Giao dịch có liên kết nhiều người với chính nó thông qua bảng tham gia TxLink. Tôi muốn gọi link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7) sẽ tạo hai đối tượng Giao dịch và TxLink liên kết hai đối tượng đó.

Tôi gặp lỗi trong dòng liên kết bên dưới vì số units: sub ở cuối. Lỗi là "đặc điểm không được xác định". Tôi đã thử units: { sub } (có ngoặc vuông) thay vào đó nhưng không có súc sắc.

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
     ignore do 
     sub 0 
     red 0 
     end 
     units { red } 

     association :giver, factory: :transaction, units: sub 
     association :taker, factory: :redemption, units: red 
    end 
    end 

Trả lời

33

Các association helper trong factory_girl không thể lấy đối số bất động sản năng động, nhưng bạn có thể sử dụng một thuộc tính năng động để nhanh chóng hiệp hội tuy nhiên bạn muốn:

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    transient do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { create(:transaction, units: sub) } 
    taker { create(:redemption, units: red) } 
    end 
end 

Nhược điểm duy nhất của việc này là các givertaker các liên kết sẽ sử dụng chiến lược tạo bất kể chiến lược bạn đang xây dựng tx_link, có nghĩa là attributes_forbuild_stubbed sẽ không hoạt động chính xác cho nhà máy tx_link.

Ví dụ tôi đã cung cấp yêu cầu phiên bản 4.5.0.

+0

bỏ qua bị phản đối. Thay vào đó, chúng ta nên sử dụng "thoáng qua" – hcarreras

23

Mở rộng về câu trả lời của Joe để cho phép sự khác biệt giữa xây dựng và tạo ra:

factory :tx_link do 
    units "9.99" 

    factory :link_red_to_sub do 
    ignore do 
     sub 0 
     red 0 
    end 
    units { red } 

    giver { build(:transaction, units: sub) } 
    taker { build(:redemption, units: red) } 

    after(:create) do |link_red_to_sub| 
     link_red_to_sub.giver.save! 
     link_red_to_sub.taker.save! 
    end 
    end 
end 
Các vấn đề liên quan