日々精進

新しく学んだことを書き留めていきます

factory girlで多対多の関連を作る

factory girlで多対多の関連を作る際にどうしてもうまくいかなくて困りました。
結果として以下のようにするとうまくいきました。
factories.rb

Factory.define :image do |f|
  f.url {Factory.next(:image_url)}
  f.blog_article_id 1
  f.training_data_registed_flg false
  f.filesize 1000
  f.filepath ""
end

Factory.define :actor_tag, :class => Tag do |f|
  f.name "testname"
  f.actor_id 1
end

Factory.define :not_actor_tag, :class => Tag do |f|
  f.name "testtag"
end



specファイル

  before(:all) do
    not_actor_tag = Factory(:not_actor_tag)
    actor_tag = Factory(:actor_tag)
    Factory(:image, :tags => [actor_tag, not_actor_tag])
    Factory(:image, :tags => [not_actor_tag, actor_tag])
  end

こんな感じでテストコードの中でどのデータに紐付けるかを指定しなければいけないようです。
この書き方はださいなぁ。。
最初はfactories.rbの中でFactory.createを使って紐付くデータを指定しようとしたんですが、どうもfactories.rbの中でcreateしてもDBには書き込まれないようです。
具体的には、以下のコードだとTagsテーブルには何もデータが作られません。
factories.rb

Factory.define :actor_tag, :class => Tag do |f|
  f.name "testname"
  f.actor_id 1
end

Factory.define :not_actor_tag, :class => Tag do |f|
  f.name "testtag"
end

not_actor_tag = Factory(:not_actor_tag)
actor_tag = Factory(:actor_tag)
Factory.define :image do |f|
  f.url {Factory.next(:image_url)}
  f.blog_article_id 1
  f.training_data_registed_flg false
  f.filesize 1000
  f.filepath ""
  f.tags => [actor_tag, not_actor_tag ]
end



specファイル

  before(:all) do
    Factory(:image, :tags => [actor_tag, not_actor_tag])