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

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

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

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

Ruby

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

Q&A

解決済

2回答

2471閲覧

【rails】多対多のアソシエーションの作り方について確認させてください。

YousukeTanaka

総合スコア79

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2018/01/02 03:47

編集2018/01/02 03:48

表題の件について理解を確認させてください。

確認したいこと

現在、多対多のアソシエーションを学んでいます。今回は、follow機能を実装しながら、それを学んでいますが、 以下の理解ができていませんので、確認させてください。

確認したいmodelのコード(フォロー機能を想定しています。)

# 自分がフォローした人を取り出す。 has_many :active_relationships,class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy has_many :followings, through: :active_relationships, source: :following # 自分のfollowerを取り出す。 has_many :passive_relationships,class_name: "Relationship", foreign_key: "following_id", dependent: :destroy has_many :followers, through: :passive_relationships, source: :follower

特に確認したい点は、has_many:@@@で、今回テーブル名でもないactive_relationshipsと
passive_relationshipsを設定している点です。これまで、1対多のアソシエーションの場合は、モデル同士の
関連付けをしており、@@@の部分にはモデル名を指定してきました。今回は、Relationshipモデルを作っており、
便宜上、active_relationshipsとpassive_relationshipsを設定しているように見受けられますが、
これは、カラムでも作成していないものです。

多対多のアソシエーションを理解する場合は、このように便宜上、擬似カラムのようなものを作成し、それを通して
(through: :active_relationship)任意の設定(followings/followers)をするのが一般的なのでしょうか?
この部分を解説してあるサイトなど見つけることができず、また、悶々としているので、理解をはっきりさせたいと考え、質問する次第です。

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

多対多のアソシエーションを理解する場合は、このように便宜上、擬似カラムのようなものを作成し、それを通して

(through: :active_relationship)任意の設定(followings/followers)をするのが一般的なのでしょうか?

・・・悶々としているので、理解をはっきりさせたいと考え、質問する次第です。

has_many の第一引数を、「モデル名」だったり「疑似カラム名」というふうに考えて
いると混乱するかもしれません。

Railsガイドで class_name の説明に、以下のように書かれています。

4.3.2.3 :class_name 関連名から関連相手のオブジェクト名を生成できない事情がある場合、:class_nameオプションを 使用してモデル名を直接指定できます。たとえば、1人の著者(author)が複数の書籍(books)を 持っているが、実際の書籍モデル名がTransactionである場合には以下のように指定します。 class Author < ApplicationRecord has_many :books, class_name: "Transaction" end

上記の説明にそっていうと、has_many :books の :books は関連名と呼ばれるものです。
ですので、この例で、もしモデルクラス Book が存在して、単に

ruby

1has_many :books

と、class_name: "Book" を省略して書ける場合であっても、
この :books はモデル名ではなくて、あくまで関連名である、
ということになります。

以上、参考になれば幸いです。


追記

上記 Railsガイドの説明文は、英語版では

4.3.2.3 :class_name If the name of the other model cannot be derived from the association name, you can use the :class_name option to supply the model name. For example, if an author has many books, but the actual name of the model containing books is Transaction, you'd set things up this way:

と書かれています。つまり、「関連名」は association name の和訳です。

投稿2018/01/02 04:24

編集2018/01/02 04:32
jun68ykt

総合スコア9058

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

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

YousukeTanaka

2018/01/02 04:34

非常にわかりやすいご説明感謝いたします。悶々としていたものがなくなり、明確な理解につながりました。
jun68ykt

2018/01/05 03:09

> 明確な理解につながりました。 とのことでよかったです!
guest

0

はい、本来has_manyに指定するものはアソシエーション名です。列名やテーブル名ではありません。

同じ名前のテーブルがある場合には特に設定しなくても勝手にテーブルを読み取ってくれますが、そうでない場合には自分で指定する、それだけの話です。

投稿2018/01/02 04:26

maisumakun

総合スコア145121

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

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

YousukeTanaka

2018/01/02 04:33

ご回答ありがとうございます。非常によくわかりました。理解を修正できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問