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

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

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

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

Ruby

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1470閲覧

Railsでの多対多モデルの扱いについて

c_yomogi

総合スコア14

Ruby on Rails 5

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

Ruby

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2018/09/10 13:39

編集2018/09/10 13:41

前提

Rails学習中のものです。
掲示板を作成している最中です。

posts_controllerをscaffoldで生成しました。
その後、モデルの構築の部分で止まっています。

データベース(モデル)の扱いがよく理解できておらず、質問させていただきます。

環境

Mac
Ruby 2.5
Rails 5.2

実装コード

以下はそれぞれのテーブルが持っているカラムです。
post...id, code, nickname, body
post_tag...id, post_id, tag_id
tag...id, code, name
type...id, code, name

post.rb

class Post < ApplicationRecord has_many :post_tags, dependent: :destroy has_many :tags, through: :post_tags belongs_to :types accepts_nested_attributes_for :post_tags, allow_destroy: true end

post_tag.rb

class PostTag < ApplicationRecord belongs_to :posts belongs_to :tags end

tag.rb

class Tag < ApplicationRecord has_many :post_tags, dependent: :destroy has_many :posts, through: :post_tags end

type.rb

class Type < ApplicationRecord has_many :posts accepts_nested_attributes_for :posts end

質問

(1)以下の関係を実装したい場合、上記のモデルは問題なさそうでしょうか?

Post:Tag = 多:多
Type:Post = 1:多

(2)この後、scaffoldで生成した投稿ページ(posts_controller)からタグと投稿文を保存したいのですが、
タグ(モデルが別)の保存方法がわかりませんでした。
調べたところ、build...?を利用しているところが多かったのですが、
多:多ではなく1:多の例でした。
多;多はどのように実装すればよいのでしょうか?

(3)rails consoleを使用してPostからTagを取得しようとしたのですが、
うまくいきませんでした。行った手順は以下のとおりです。

post = Post.new #モデル初期化 post.post_tags #post_tagsの取り出し?(空でした) post.tags    #tagsの取り出し?(post_tagsが間にあるために取得できないのでしょうか..?)

以上3点です。
この他に、こうするともっと良くなる等ございましたら、ご教授願えますでしょうか。

不明点等ございましたら、お手数ですが質問していただけると嬉しいです。
追加で回答させていただきます。

よろしくお願いいたします。

長文失礼しました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

(1)
post.rb

belongs_to :type # 単数形

です。

(2)
多対多に関しては、中間テーブルまで一気に作成するのではなく、中間テーブルと、その先のテーブルを別に作成する必要があると思います。
(ここは僕もありそうだと思って調べたのですが、見つからなかったので、そういう風に実装しています。)
また、rails cなどで確認していただけるとわかると思うのですが、buildはただforein_keyに自分のidを入れるだけなので、呼び出し元をdbに保存していないと意味がありません。
ex.

post_1 = Post.new post_1.post_tags.build # このpost_tagのpost_idはnilになる post_2 = post.create post_2.post_tags.build # ここでpost_tag.post_idが入るので、post_2.post_tagsで取得できる

なので、post_paramsとtag_paramsが定義されていると仮定すると、
(もしわからなければrails strong parametersなどで検索して見てください。
機能的にはparams[:post][:body]とかやるのと同じです)

post = Post.create(post_params) tag = Tag.create(tag_params) post.post_tags.create(tag: tag)

などのようにすれば実装できると思います。

(3)

post = Post.new # この段階ではまだpost_tagやtagは作成されていない post.post_tags #=> [] tag = Tag.create post.post_tags.build tag: tag # post_tagの作成(保存ではない) post.tags # => tag

以上です。
参考になれば幸いです。
また、僕も勉強中なので、もしなにか発見があれば教えていただけると嬉しいです。

投稿2018/09/13 04:19

tomohiroo

総合スコア19

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

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

c_yomogi

2018/09/13 08:06

ご丁寧にありがとうございます! 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問