我正在尝试创建一些测试数据来填充我的表格,以便我可以在我的网站上测试功能。
相关表格包括:songs
,song_arrangements
和song_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
我已经能够使用以下代码在FactoryGirl中创建25首歌曲:
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
有关如何创建与{1}}或song_arrangements
记录正确相关的song_arrangement_files
和song_arrangement
的任何想法?
我猜我可能会以某种方式在我的工厂中嵌套song
。我对FactoryGirl很新,而且对Rails来说还是比较新的。非常感谢任何帮助!
答案 0 :(得分: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) }
答案 1 :(得分: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的回答是我从中解决了这个问题。