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

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

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

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

Ruby

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

Q&A

1回答

254閲覧

createとActive Recordのassociationについて

olaf

総合スコア17

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/06/12 11:48

編集2018/06/29 01:40

Ruby

1class Message < ApplicationRecord 2 belongs_to :message_room 3 validates :message_room_id, presence: true 4end

Ruby

1class MessagesController < ApplicationController 2 def create_bundle_scout 3 # メッセージの送信先 4 message_destinations = [18, 35, 289] 5 # メッセージの送信先分のmessage_roomを作成 6 message_destinations.each do |message_destination| 7 message = Message.create() 8 message.destination = message_destination 9 message.body = 'スカウトします!' 10 message_room = MessageRoom.create() 11 message_room.type = 'scout' 12 message_room.messages << message 13 end 14 end 15end

説明の都合上、あえてこのような書き方をさせていただいています。
上記ソースコードでDBに保存されている結果は以下の通りでした。

messagesテーブル
id: 1, message_room_id: 1, destination: 18, body: 'スカウトします!'
id: 2, message_room_id: 2, destination: 35, body: 'スカウトします!'
id: 3, message_room_id: 3, destination: 289, body: 'スカウトします!'

message_roomsテーブル
id: 1, type: 'scout'
id: 2, type: 'scout'
id: 3, type: 'scout'

DBに保存されるタイミングをpry-byebugで確認したところ、message_roomは「message_room = MessageRoom.create()」の時点でDBに保存されていましたが、messageは「message_room.messages << message」の時点で保存されていました。createされた時点で保存されるものだと思っていたのですが、「message_room.messages << message」で保存が実行されるのは、どういう仕組みになっているのでしょうか?

不足している情報があれば教えていただければ幸いです。
お手数をおかけしますが、ご回答のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

messageは「message_room.messages << message」の時点で保存されていました。

うーん、この時点で保存されてるのではなく?

message = Message.create()

追記

もしそうだとしたら、createのタイミングでエラーが出てるのでは?
★を追加しました。

message = Message.create() ★logger.debug message.errors.full_messages

検証お願いします。

投稿2018/06/26 14:37

編集2018/07/01 08:16
dobby618

総合スコア302

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

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

olaf

2018/06/29 01:39 編集

はい、再度確認したところ、「message_room.messages << message」で実行されていました。 ちなみに、message.rbにおいて、 validates :message_room_id, presence: true が漏れていました。申しわけございません。 もしかしたらこれが影響しているのでしょうか?message_room_idが存在すると保存されるのでしょうか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問