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

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

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

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

Q&A

解決済

3回答

1371閲覧

<Ruby on Rails> データの紐付けで何をしているのか分かりません

dal

総合スコア38

Ruby on Rails

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

0グッド

0クリップ

投稿2018/09/28 08:32

編集2018/09/28 08:38

以下のようなコードがあるのですが、初心者のため何をしているのかさっぱり分かりません...

app/models/message.rb↓

ruby

1belongs_to :from, class_name: "User" 2belongs_to :to, class_name: "User"

app/models/user.rb↓

ruby

1has_many :from_messages, class_name: "Message", 2 foreign_key: "from_id", , dependent: :destroy 3has_many :to_messages, class_name: "Message", 4 foreign_key: "to_id", dependent: :destroy 5has_many :sent_messages, through: :from_messages, source: :from 6has_many :received_messages, through: :to_messages, source: :to

普段はこのように書いていました。

app/models/message.rb↓

ruby

1belongs_to :user

app/models/user.rb↓

ruby

1has_many :massages, dependent: :destroy

詳しい方がいたら分かりやすく説明していただきたいです...
お願いします...

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

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

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

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

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

guest

回答3

0

ベストアンサー

throughとsourceに関してわからないということで追記です

throughは「2つのテーブルのレコードががm個:n個で関連している」場合に、中間テーブルを用いて関連付けするときに使います

例えば、製品を管理するProductモデルと製品の分類を行うCategoryモデルがあるとします。
productsテーブルの製品である「リンゴ」は、「果物」と「新鮮」というCategoryに分類されています
productsテーブルの別の製品である「みかん」は、「果物」と「柑橘系」というCategoryに分類されています

このとき、productsテーブルのレコード1つに対して、複数のcategoriesテーブルのレコードが関係していますね?また、categoriesテーブルのレコード「果物」に対しても、「リンゴ」・「みかん」のふくすうレコードが関係しています。

この場合「productsテーブルとcategoriesテーブルのレコードがm:nで関連している」といいます

では「中間テーブル」とは何か。これは、「リンゴ」に対して関連する「果物」と「新鮮」というレコードの関連だけを保持しておくテーブルです。このテーブルには、「リンゴ」「果物」というレコードと、「リンゴ」「新鮮」というレコードが別のレコードとして保存されます。ただし、全ての情報を持つのは効率的ではないため、識別するためのラベルみたいなものとしてid情報だけを保持しておきます

中間テーブルの名前をまぁ適当に"chukans"とでもしておきます。この時、モデル・テーブルの構成は以下みたいな感じです

ruby

1Productモデル 2has_many :chukans 3has_many :categories ,through: :chukans 4 5Categoryモデル 6has_many :chukans 7has_many :categories ,through: :chukans 8 9Chukanモデル 10belongs_to :product 11belongs_to :category

Product - Chukan - Category と関連付けたいので、through: :chukansとしてあげます
ProductとCategoryは複数対複数の関係にあるので、お互いをhas_manyで関連付けます
ChukanはProductとは1対複数、Categoryとも1対複数の関係にあるので、belongs_toで関連付けます

ruby

1###productsテーブル### 2id:integer 3name:string #適当な情報として、製品の名前を持つものとします 4 5###categoriesテーブル### 6id:integer 7name:string #適当な情報として、製品の名前を持つものとします 8 9###chukansテーブル### 10id:integer 11products_id:integer #このidで関連するproductsを識別します 12category_id:integer #このidで関連するcategoriesを識別します 13

これで、適当なproductsインスタンス@productsに関連するcategoriesは以下で取得できます

ruby

1@product = Product.find(1) #例えばid=1のproduct {id: 1, name: "リンゴ"} 2@categories = @product.categories #関連するCategoryレコード全部を得られる [{id: 1,name: "果物"},{id: 2, name: "新鮮"}]

さて、sourceですが、そろそろ説明を繰り返すのに疲れたので参考サイト探してきました。
偉大なる先駆者様に感謝
http://www.coma-tech.com/archives/223/

投稿2018/09/29 03:55

編集2018/09/30 09:07
sansansandodo

総合スコア248

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

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

dal

2018/11/12 06:35

ご丁寧に教えていただき、ありがとうございました!
guest

0

aaaaaaaaaaa

投稿2018/09/28 09:13

編集2018/09/30 09:44
sansansandodo

総合スコア248

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

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

sansansandodo

2018/09/28 18:38

Kari のとこはUserです。 仮置きしてたのを書き換え忘れてましたすみません
guest

0

列名が違う場合に、手動で設定しているだけです。

普段は設定より規約で、Userと紐付けるのであればuser_id列を使う、というようにすればいいのですが、今回の場合ユーザーで送りあうメッセージである以上、両方をuser_idとはできないので、別の名前にするために設定が必要となっています。

投稿2018/09/28 08:35

maisumakun

総合スコア145183

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

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

dal

2018/09/28 08:56

ご回答ありがとうございます。 `user_id`ではなく、`from_id`と`to_id`を使用するということですね。 app/models/user.rbの方の、throughやsourceはどういう意味でしょうか?調べてもよくわからなくて...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問