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

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

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

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

Q&A

解決済

1回答

517閲覧

Rails 子モデルにも同時にレコード追加したい

ruby_0ct

総合スコア57

Ruby on Rails

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

0グッド

0クリップ

投稿2018/07/24 18:43

編集2018/07/26 10:30

記事を投稿したする際に子モデルのカテゴリーにも同時にレコード追加したいのですが、うまくいきません。
記事を投稿するページにアクセス(newアクション)すると、以下のエラーになってしまいます。

unknown attribute 'postit_id' for Postitcategory. @postit.postitcategories.build

子モデルとの関連付け方が良くないのだと思うのですが、どのようにすればよいでしょうか?
ご回答いただけると助かります。

#コントローラ
postits_controller

ruby

1def new 2 @postit = Postit.new 3 @postit.postitcategories.build 4end

モデル

モデルの関係は Postit 1対多 Postitcategoryです。

Postit

idtitlepostitcategory_idnamecontent
1テスト1太郎内容
2Railsについて2太郎内容

ruby

1class Postit < ApplicationRecord 2 has_many :postitcategories 3 4 accepts_nested_attributes_for :postitcategories 5end 6

Postitcategory

idcategory
1日常
2開発

ruby

1class Postitcategory < ApplicationRecord 2 belongs_to :postit, optional: true 3end

View

ruby

1<%= form_with(model: postit, local: true) do |form| %> 2 <div class="field"> 3 <%= form.label :title %> 4 <%= form.text_field :title %> 5 </div> 6 7 <div class="field"> 8 <%= fields_for(:postitcategories) do |c| %> 9 <%= c.label :category %> 10 <%= c.text_field :category %> 11 <% end %> 12 </div> 13 14 <div class="field"> 15 <%= form.label :name %> 16 <%= form.text_field :name %> 17 </div> 18 19 <div class="field"> 20 <%= form.label :content %> 21 <%= form.text_field :content %> 22 </div> 23 24 <div class="actions"> 25 <%= form.submit %> 26 </div> 27<% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

has_manyとbelongs_toが逆です。
Postit側にpostitcategory_idを持つ場合、

Postitがbelongs_to :postitcategory
PostitCategoryがhas_many :postitsになります。

Relational DBでは、後に作成したレコードが、先に存在するレコードの主キーを参照することになるので、子要素のほうが参照カラムを持ちます。
それに対応するRailsのassociationマクロは、belongs_toになります。

なので、
ご提示のケースにおいては、postitcategoriesの側に、postit_idを持たせるのが正しいと思います。

投稿2018/07/25 02:07

編集2018/07/25 02:08
takumiabe

総合スコア661

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

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

ruby_0ct

2018/07/25 16:17

ご回答ありがとうございます。 主キーの参照について、大変参考になります。 buildのところで「undefined method `build' for nil:NilClass」となってしまうのですが、どのようにしたら良いのでしょうか? 修正したコードは追記いたしました。
ruby_0ct

2018/07/26 10:30

追記に関しては、ひとまず別の質問にしたいと思います。 ありがとうございました。
takumiabe

2018/07/27 01:25

あ、 > postitcategoriesの側に、postit_idを持たせる 場合は、belongs_to と has_manyは元のままで良いです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問