has_manyとかいまいちわからない人向け!
これがわかる人は不要 Rails ガイド
1.has_manyとbelongs_toはセットではない。一緒に使うことが多いが独立して使うことができる。
2.メソッドを理解することが重要!
例えば
Author(著者)テーブルとBook(本)テーブルがあったとし、その二つを関連づけたい時。
class Author < ApplicationRecord
has_many :books, dependent: :destroy
endclass Book < ApplicationRecord
belongs_to :author
end
上記の記述で下記のような連携ができるらしいのだが、いまいちどのような仕組みなのかわからなかった、、
@book = @author.books.create(published_at: Time.now)
こう言う時は一つづつ分解して考えるといい
authorはオブジェクト
booksはメソッド
createもメソッド
createがメソッドなのはなんとなくわかるのだが、booksは??
もしhas_many: booksがなければメソッドにはならない。has_many: booksを追加したことによりbooksメソッドができた。ここでは表記されていないが実はhas_manyはbooks()だけでなく他のメソッドの使用も可能にしている。
そもそもメソッドってなんだっけ??
Rubyでよく見かけたこんな感じのやつです。引数を入れるとreturnで値を返す。
def index
@products = Product.all
end
booksはこのようなメソッドであり、returnで返ってきた値が反映される。
author.books.create
と書かれていた時、Rubyの処理系は以下のように順番に評価していきます。
authror を評価
この場所で authorという単語がどんな意味に当たるのか調べに行く(ここではAuthorモデルの値だとわかる)
authorに対して booksを呼ばれていると認識する。
booksというメソッドを authorに対して呼び出します。もしもauthorの実体であるAuthorモデルにbooksが定義されていれば呼び出すことができます。
「authorオブジェクトが持っている情報でBook を検索する」モデル名なので大文字始まり。
もしくはテーブルから検索するイメージだとすると booksでも良いですがちょっと意図がずれそうです。
この結果、戻り値としては ActiveRecord::Relationが返ってきます。
ActiveRecord::Relationに対してcreateが呼ばれていると認識する
戻り値で返ってきたActiveRecord::Relationにcreateを呼びます。この呼び出しはActiveRecord::Relationがもともとbooksというメソッドの戻り値であったこととは無関係です。あくまで検索した内容の結果として値が利用されるだけです。
テキストに打ち込み説明するのは難しいですが、私自身も今理解しているところなので何かご指摘などございましたらよろしくお願いします。