0
0

More than 3 years have passed since last update.

Rails 初学者のアソシエーションの解説

Last updated at Posted at 2019-12-05

has_manyとかいまいちわからない人向け!

これがわかる人は不要 Rails ガイド

1.has_manyとbelongs_toはセットではない。一緒に使うことが多いが独立して使うことができる。
2.メソッドを理解することが重要!

例えば
Author(著者)テーブルとBook(本)テーブルがあったとし、その二つを関連づけたい時。

class Author < ApplicationRecord
has_many :books, dependent: :destroy
end

class 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というメソッドの戻り値であったこととは無関係です。あくまで検索した内容の結果として値が利用されるだけです。
テキストに打ち込み説明するのは難しいですが、私自身も今理解しているところなので何かご指摘などございましたらよろしくお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0