4

サイトの機能をテストできるように、テーブルに入力するテスト データを作成しようとしています。

問題のテーブルは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

それぞれのレコードに正しく関連付けられているsong_arrangements作成方法について何か考えはありますか?song_arrangement_filessong_arrangementsong

after(:create)どうにかして自分の工場でネストされたものを使用できると思います。私は FactoryGirl の初心者であり、Rails 全般についてはまだかなり初心者です。どんな助けでも大歓迎です!

4

2 に答える 2

3

だから私の他の答えは、私がしなければならないことをするのに役立ちました。しかし、私は基本的に関連付けの 1 レベルを深くする必要があり、その解決策で壁にぶつかっていました。関連付けに関する 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) }
于 2013-01-10T16:16:59.833 に答える
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

クレジットが必要な場所にクレジットを与えると、この投稿から多くの検索を行った後、実際に答えが見つかりました:ファクトリーガールを使用して、作成時にそれを必要とする検証を使用して、has_manyで関連付けられたリストを作成する方法

私が解決策を引き出したのはBlizzoの答えでした。

于 2013-01-08T22:25:00.433 に答える