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

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

ただいまの
回答率

90.84%

  • Ruby

    6761questions

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

  • Ruby on Rails 5

    1101questions

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 207

YousukeTanaka

score 60

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

確認したいこと

現在、多対多のアソシエーションを学んでいます。今回は、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)をするのが一般的なのでしょうか?
この部分を解説してあるサイトなど見つけることができず、また、悶々としているので、理解をはっきりさせたいと考え、質問する次第です。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

こんにちは。
 

多対多のアソシエーションを理解する場合は、このように便宜上、擬似カラムのようなものを作成し、それを通して
(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 が存在して、単に

has_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 13:34

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

    キャンセル

  • 2018/01/05 12:09

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/02 13:33

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

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    6761questions

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

  • Ruby on Rails 5

    1101questions