【Rails】acts-as-taggable-onで作成したタグ機能をseedデータに取り入れる


目的

自作のアプリにダミーユーザーを作成。
その際acts-as-taggable-onで作成したタグの挙動や見栄えの確認をしていきます。

参考:
Railsにタグ機能をつける。acts-as-taggable-on使用
rails acts-as-taggable-on でタグ付け後、タグを使って検索

環境

windows10 home
Ubuntu 20.04.1 on WSL2
rails 6.0.3
ruby 2.6.6

seedデータ作成(失敗)

まずはタグ表示無しでデータが作れるか試してみる。

seeds.rb
50.times do 
  user = User.create!( 
    name: Faker::Games::Pokemon.unique.name, 
    email: Faker::Internet.email, 
    password: "password", 
    password_confirmation: "password" 
  ) 
end 
15.times do |n| 
  User.each do |user| 
    user.microposts.create!( 
      photo: open("./db/fixtures/#{n + 1}.jpeg"), 
      detail: Faker::Hacker.say_something_smart 
    ) 
  end 
end

無事データが投入されたので、タグ付きのデータが投入できるか試してみる。

seeds.rb(失敗例)
User.limit(5).each do |user|  # 5人のユーザーを選んで各々をuserに代入 
  15.times do |n|             # user1人につき15回投稿作成する 
    user.microposts.create!( 
      photo: open("./db/fixtures/#{n + 1}.jpeg"), 
      detail: Faker::Hacker.say_something_smart 
    ) 
    array = Faker::Food.dish.split("") 
    array.each{ |tag| 
      tag_list = ActsAsTaggableOn::Tag.new 
      tag_list.name = tag 
      tag_list.save 
    } 
  end 
end

これならFakerの中にある単語を空白("")で区切って配列にし、一つ一つをtag_listに代入してくれるんじゃないかと思ってました。

結果、データを投入することはできたが各投稿にタグがついていないということに...。
調べたところ、どうやら文字列の配列化はできないっぽい。

参考:配列っぽい文字列をうまく配列に変換する

seedデータ作成(成功)

どうやってmicropostインスタンスとtag_listを結びつけるのかがわからない。
そう思いながらこの記事を見ていたら次の引用部分で突然ひらめいた。

...
product = Product.create(
...
)
product.tag_list.add "tag1", "tag2"
product.save
...

そうか、micropostインスタンスを作るときに同時にmicropostを定義すればいいんだ!
その後tag_listも定義すればmicropost.tag_listでmicropostとtag_listを結び付けられる。

seeds.rb
User.limit(5).each do |user|  # 5人のユーザーを選んで各々をuserに代入 
  15.times do |n|             # user1人につき15回投稿作成する 
    micropost = user.microposts.create!( 
      photo: open("./db/fixtures/#{n + 1}.jpeg"), 
      detail: Faker::Hacker.say_something_smart 
    ) 
    tag_list = ActsAsTaggableOn::Tag.new # tag_listを定義
    micropost.tag_list = Faker::Food.dish # micropostとtag_listを結びつける
    micropost.save 
  end 
end


無事タグ付きの投稿データを作成することができました。