2013-01-08 91 views
4

我想創建一些測試數據來填充我的表格,以便我可以在我的網站上測試功能。rails 3 - FactoryGirl創建相關記錄

有問題的表格是:songs,song_arrangementssong_arrangement_files。以這種方式關聯。

Songs: 
    has_many :song_arrangements, :dependent => :destroy 
    has_many :song_arrangement_files, :through => :song_arrangements 

Song Arrangements: 
    belongs_to :song 
    has_many :song_arrangement_files, :dependent => :destroy 

Song Arrangement Files: 
    belongs_to :song 
    belongs_to :song_arrangement 

我已經能夠創造25首歌曲FactoryGirl與此代碼:

Code in my spec file: 
    before { FactoryGirl.create_list(:song, 25) } 

Code in the factory: 
    FactoryGirl.define do 
     factory :song do |s| 
      s.sequence(:title) { |n| "Song Title #{n}" } 
      s.sequence(:artist) { |n| "Song Artist #{n}" } 
     end 
    end 

關於如何創建song_arrangementssong_arrangement_files符合其各自song_arrangementsong記錄正確assciated有什麼想法?

我猜我可以用after(:create)嵌套在我的工廠以某種方式。我對FactoryGirl很新,對Rails一般來說還是比較新的。任何幫助深表感謝!

+0

不知道它的問題,但我使用的RSpec對我的測試。 – ryanpitts1

回答

3

所以我的其他答案幫助我做我需要做的事情;然而,我需要基本上走更深層次的關聯,並且我正在用這個解決方案打牆。我結束重讀FactoryGirl文檔的關聯,並提出了適用於所有情況的解決方案。它創建歌曲,song_arrangements和song_arrangement_files。我確信代碼不是很漂亮,但它可以工作,並且可以在以後改進。希望這有助於任何人遇到相同類型的包版。

FactoryGirl.define do 
    factory :song do |s| 
    s.sequence(:title) { |n| "Song Title #{n}" } 
    s.sequence(:artist) { |n| "Song Artist #{n}" } 

    factory :song_with_song_arrangements do 
     ignore do 
     song_arrangements_count 100 
     end 

     after(:create) do |song, evaluator| 
     FactoryGirl.create_list(:song_arrangement, evaluator.song_arrangements_count, song: song) 
     end 
    end 
    end 

    factory :song_arrangement do |sa| 
    song 

    sa.sequence(:title) { |n| "Arrangement #{n}" } 
    original_key 'A' 
    bpm 75 
    sa.sequence(:chart_content) { |n| "This is the chart content for Arrangement #{n}." } 
    chart_mapping 'V1, C, V2, C, B, C, C' 
    sa.sequence(:notes) { |n| "These are notes for the Arrangement #{n}." } 

    factory :song_arrangement_with_song_arrangement_files do 
     ignore do 
     song_arrangement_files_count 100 
     end 

     after(:create) do |song_arrangement, evaluator| 
     FactoryGirl.create_list(:song_arrangement_file, evaluator.song_arrangement_files_count, song_arrangement: song_arrangement) 
     end 
    end 
    end 

    factory :song_arrangement_file do |saf| 
    song_arrangement 
    song 

    saf.sequence(:title) { |n| "Attachment #{n}" } 
    url 'http://www.google.com' 
    saf.sequence(:description) { |n| "This is the description of Attachment #{n}." } 
    end 
end 

代碼用來調用這些工廠:

Songs: 
    before(:each) { FactoryGirl.create_list(:song, 25) } 
Song Arrangements: 
    before(:each) { FactoryGirl.create(:song_with_song_arrangements) } 
Song Arrangement Files: 
    before(:each) { FactoryGirl.create(:song_arrangement_with_song_arrangement_files) } 
2

對於遇到這個問題的其他人,這裏是我提出的解決方案。正如我所說,我是FactoryGirl的新手,所以如果有更好的方法來做到這一點,請分享!

FactoryGirl.define do 
    factory :song do |s| 
    s.sequence(:title) { |n| "Song Title #{n}" } 
    s.sequence(:artist) { |n| "Song Artist #{n}" } 

    before(:create) do |song| 
     song.song_arrangements << FactoryGirl.build_list(:song_arrangement, 10) 
    end 
    end 

    factory :song_arrangement do |sa| 
    sa.sequence(:title) { |n| "Arrangement #{n}" } 
    original_key 'A' 
    bpm 75 
    sa.sequence(:chart_content) { |n| "This is the chart content for Arrangement #{n}." } 
    chart_mapping 'V1, C, V2, C, B, C, C' 
    sa.sequence(:notes) { |n| "These are notes for the Arrangement #{n}." } 
    end 
end 

給予信貸,信貸是因爲,我居然找到了答案有很多,從這個帖子搜索後:How to user factory girl to create associated lists with a has_many with a validation that requires it on create

這是Blizzo的回答,我從拉的解決方案。

相關問題