ずみーBlog

元クラゲ研究者(見習い)の92年生まれがエンジニアを目指しながら日々寄り道するブログです。

Railsのアソシエーション 〜お前、なぜそれを知っている?!〜

どうも、ずみーです。
突然ですがみなさん、Railsの勉強をしていて、不思議に思うことはありませんか。

お前、なぜそれを知っている?!と。

実はこのRails、こっちが指示していないことも裏でたくさんやっといてくれる、
小粋な心遣いがいっぱいなのでした。

ことの発端

ある日、手順書を見ながらチュートリアルアプリの実装を進めていました。
テーブルは2つです↓

users

id email
1 hogehoge@qmail.com
2 norinori@uahoo.co.jp

tweets

id text user_id
1 ノリノリだぜ 2
2 おりゃあああ 1
3 グフっ 1
4 なんだって? 2

1人のユーザに対して、複数のツイートが存在するという状況です。
(ツイートの例がアホみたいですが気にしないで^^)

モデルにアソシエーションを設定

userモデル

class User < ApplicationRecord
  〜省略〜
  has_many :tweets
end

tweetモデル

class Tweet < ApplicationRecord
  〜省略〜
  belongs_to :user
end

has_manyメソッドとbelongs_toメソッドでアソシエーション(関係)を記述していきます。
ユーザ:ツイートが1:多なので、 英語で書いてみるとわかりやすい。

User has many tweets.
Tweet belongs_to user.

...って、あれ?

has_many :tweets

モデル名が複数形になってる!

もう一つの疑問

user_idがユーザのことだってなぜわかるのだろう?
確かにtweetはuser_idをキーとしてuserと紐づいています。

users

id email
1 hogehoge@qmail.com
2 norinori@uahoo.co.jp

tweets

id text user_id
1 ノリノリだぜ 2
2 おりゃあああ 1
3 グフっ 1
4 なんだって? 2

調べてみた

今回の疑問は二つ。

  1. モデル名はtweetなのに、なんでhas_manyで複数形のtweetsが使えるのだろう?
  2. tweetの中でユーザを示すカラムがuser_idだとなぜわかるのだろう?

超絶詳しい記事がありました(放棄)

記事によると、モデル名(必ず単数形)やカラム名を、規約通りに書くことで、Railsがよしなに判断してくれるというものでした。
まさにCoC(Convention over Configuration)(設定より規約)なのですね。
それでは、また。