前提・実現したいこと
初学者エンジニアです。
現在Railsを使用しアンケート機能を作成中で、質問内容をタグで管理したいと考えています。
質問内容とタグは多対多の関係性で作成しようと考えています。
seed_fuというgemを使用し、データを登録させようと考えているのですが中間テーブルの登録がうまく実装できず、この度質問させていただきました。
質問内容を管理するモデル
class QuestionnaireForm < ApplicationRecord has_and_belongs_to_many :questionnaire_tags validates :title, presence: true end
質問管理用のタグのテーブル
class QuestionnaireTag < ApplicationRecord has_and_belongs_to_many :quetionnaire_forms validates :title, presence: true end
中間テーブル
class QuestionnaireFormTag < ApplicationRecord belongs_to :questionnaire_tag belongs_to :questionnaire_form end
create_table "questionnaire_form_tags", force: :cascade do |t| t.bigint "questionnaire_tag_id", null: false t.bigint "questionnaire_form_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end create_table "questionnaire_forms", force: :cascade do |t| t.bigint "questionnaire_id", null: false t.string "title", null: false t.integer "display_order", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end create_table "questionnaire_tags", force: :cascade do |t| t.string "title", null: false t.integer "display_order", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end
questionnaire_form.rb(seed作成している部分)
require 'csv' CSV.table("#{Rails.root}/db/fixtures/csv/questionnaire_form.csv").each do |record| next if record[:id].nil? questionnaire = QuestionnaireForm.seed do |s| s.id = record[:id] s.title = record[:title] s.display_order = record[:display_order] s.questionnaire_id = 1 end questionnaire_tag_ids =[] case record[:display_order] when (1..14) questionnaire_tag_ids = [QuestionnaireTag.find_by(display_order: 1), QuestionnaireTag.find_by(display_order: 2)] when (15..35) questionnaire_tag_ids = [QuestionnaireTag.find_by(display_order: 1), QuestionnaireTag.find_by(display_order: 3)] when (36..68) questionnaire_tag_ids = [QuestionnaireTag.find_by(display_order: 9), QuestionnaireTag.find_by(display_order: 6)] when 69 questionnaire_tag_ids = [QuestionnaireTag.find_by(display_order: 9), QuestionnaireTag.find_by(display_order: 4)] when 70 questionnaire_tag_ids = [QuestionnaireTag.find_by(display_order: 9), QuestionnaireTag.find_by(display_order: 5)] when (71..100) questionnaire_tag_ids = [QuestionnaireTag.find_by(display_order: 9), QuestionnaireTag.find_by(display_order: 8)] end questionnaire.questionnaire_tags << questionnaire_tag_ids end
CSVを使用していますがCSV内には質問内容等の具体的な情報が含まれています。
今回のエラーは上記テキスト最後の行の
questionnaire.questionnaire_tags << questionnaire_tag_ids
の部分でquestionnaire_tags が見つからずNoMethodErrorとなってしまいます。
エラーコードを確認し、byebugでデバッグもしましたが最後のタグデータを参照しようとする部分でエラーが発生しており原因がわからず苦戦しています。
発生している問題・エラーメッセージ
エラーメッセージ == Filtering seed files against regexp: /questionnaire_form.rb/ == Seed from /var/www/app/db/fixtures/questionnaire_form.rb - QuestionnaireForm {:id=>1, :title=>"朝食を食べますか?", :display_order=>1, :questionnaire_id=>1} rails aborted! NoMethodError: undefined method `questionnaire_tags' for #<Array:0x0000558675da1a00>
試したこと
https://mbleigh.lighthouseapp.com/projects/10223/tickets/7-ability-to-set-habtm-associations
上記サイトを参照し一度QuestionnaireFormを作成した後そこにquestionnaire_tag_idsを指定する方法をとりましたが変わらず上記エラーが発生してしまいます。
どんな些細な事でもご指摘頂けますと幸いです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/08 22:39