質問: 表題の件について理解を確認させてください。 > > 確認したいこと > > > ``` 現在、多対多のアソシエーションを学んでいます。今回は、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)をするのが一般的なのでしょうか? この部分を解説してあるサイトなど見つけることができず、また、悶々としているので、理解をはっきりさせたいと考え、質問する次第です。 以上、よろしくお願いいたします。
回答: こんにちは。 > > 多対多のアソシエーションを理解する場合は、このように便宜上、擬似カラムのようなものを作成し、それを通して > > (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** の和訳です。