質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

4750閲覧

Rails : has_manyをseedファイル内で初期データとして設定する方法

innjera

総合スコア132

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

1グッド

0クリップ

投稿2017/04/25 00:03

編集2017/04/25 03:14

以下の通りLessonSituationの間に多対多の関連付けを組んでおり、通常の動作(new/create/edit/update)には問題ありません。

初期データとしてseedファイル内にて最初から関連付けがされた状態としたいのですが、lesson.situations << Situation.all.sampleLessonmodelのseedファイルに記載したところ、ActiveRecord::AssociationTypeMismatch:Situation(#70127423708740) expected, got NilClass(#70127366627340)といったエラーが出てしまい解決できず、やり方をご教示頂けますと大変助かります。

ちなみに、associationを無理やりseedファイル内にて定義しなければ、seedファイルは通ります。

また、rails cで同じコマンドを打つと、確り機能します。

ruby

1[1] pry(main)> lesson = Lesson.find(42);0 2 Lesson Load (0.8ms) SELECT "lessons".* FROM "lessons" WHERE "lessons"."id" = $1 LIMIT $2 [["id", 42], ["LIMIT", 1]] 3=> 0 4[2] pry(main)> situation = Situation.all.sample;0 5 Situation Load (0.6ms) SELECT "situations".* FROM "situations" 6=> 0 7[3] pry(main)> lesson.situations << situation;0 8 (0.4ms) BEGIN 9 SQL (0.6ms) INSERT INTO "lessons_situations" ("situation_id", "lesson_id") VALUES ($1, $2) [["situation_id", 2], ["lesson_id", 42]] 10 (4.8ms) COMMIT 11=> 0 12[4] pry(main)> lesson.situations.count 13 (1.3ms) SELECT COUNT(*) FROM "situations" INNER JOIN "lessons_situations" ON "situations"."id" = "lessons_situations"."situation_id" WHERE "lessons_situations"."lesson_id" = $1 [["lesson_id", 42]] 14=> 3

###前提
modelLessonSituationの2つで、各々のtable含むmodelは以下の通りです。また、LessonSituationの間にjoin tableを組んでます。(以下コード内に記載)

rby

1#Lesson modelとtable 2 id :integer not null, primary key 3 title :string 4 created_at :datetime not null 5 updated_at :datetime not null 6 7class Lesson < ApplicationRecord 8 has_and_belongs_to_many :situations 9 10#Situation modelとtable 11 id :integer not null, primary key 12 name :string 13 created_at :datetime not null 14 updated_at :datetime not null 15 16class Situation < ApplicationRecord 17 has_and_belongs_to_many :lessons 18end 19 20class CreateJoinTableSituationLesson < ActiveRecord::Migration[5.0] 21 def change 22 create_join_table :situations, :lessons do |t| 23 # t.index [:situation_id, :lesson_id] 24 # t.index [:lesson_id, :situation_id] 25 end 26 end 27end

seedsファイルです。Situationからsampleメソッドを用いてランダムに取り出し、Lessonに関連つけたいとの意図です。

lesson.situations << Situation.all.sampleに誤りがあること明らかですが、正しい書き方が分かりません。。

ruby

1#Lesson Modelのseedファイル 21.upto(10) do |n| 3 lesson = Lesson.create( 4 title: "#{titles[n % 4]}", 5 posted_at: 20.days.ago.advance(days: n), 6 updated_at: 20.days.ago.advance(days: n+2), 7 ) 8 lesson.situations << Situation.all.sample 9end 10 11#Situation Modelのseedファイル 12areas_of_situations = %w(日常 デート オフィス 面接/就活 パーティー 結婚式 季節 クラブ コスプレ ハロウィン 特殊 その他) 13 14areas_of_situations.each do |name| 15 Situation.create(name: name) 16end 17
ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

原因は分からぬままですが、lessonmodelから関連づけずに、Situationmodelからlessonmodelに関連つけることでうまく行きました。

Lesson Modelのseedファイルからlesson.situations << Situation.all.sampleを削除し、Situation Modelのseedファイルに以下記載

ruby

1areas_of_situations = %w(日常 デート オフィス 面接/就活 パーティー 結婚式 季節 クラブ コスプレ ハロウィン 特殊 その他) 2 3areas_of_situations.each do |name| 4 Situation.create(name: name) 5end 6 71.upto(42) do |n| 8 situation = Situation.all.shuffle.take(rand(1..2)) 9 lesson = Lesson.find(n) 10 lesson.situations << situation 11end 12 131.upto(10) do |n| 14 situation = Situation.all.shuffle.take(rand(3..5)) 15 adviser = Adviser.find(n) 16 adviser.situations << situation 17end

投稿2017/04/27 23:37

innjera

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問