10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【rails調査】has_manyとかbelongs_toとかのDBアソシエーションがどんなsql投げてるか調べてみた。

Last updated at Posted at 2016-05-09

最近はSequelProに頼らず、sqlを書いてDBを確認するようになりました。
reactでcomment部分を作ろうとしたときに、railsのアソシエーションが使えなくて、ちょっと困ったのでsqlを調べて、自前で書けたらもしかしたら行けるかも。という気持ちの元調べてみました。

SequelPro(便利)
http://www.sequelpro.com/

調べた感想

  • 意外と簡単なsqlしか投げてなかった!!
  • でも、一回オブジェクトを取得したらキャッシュしてくれていてステキな仕組みだった笑

調べたコマンド

  • all
  • belongs_to
  • has_many
  • has_many & first & belongs_to
  • キャッシュ機構

all

$ rails consoleで中に入ってmodelメソッドをうって行きます。

最初はとりあえず

posts = Post.all

スクリーンショット 2016-05-09 14.17.53.png
Post Load (0.7ms)  SELECT `posts`.* FROM `posts`

belongs_to

posts[2].user

スクリーンショット 2016-05-09 14.03.22.png
User Load (8.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1

has_many

posts[2].comments

スクリーンショット 2016-05-09 14.03.33.png
Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`post_id` = 4

has_many & first & belongs_to

posts[1].comments.first.user.name

スクリーンショット 2016-05-09 14.06.18.png
  Comment Load (0.4ms)  SELECT  `comments`.* FROM `comments` WHERE `comments`.`post_id` = 2  ORDER BY `comments`.`id` ASC LIMIT 1
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1

キャッシュ機構

スクリーンショット 2016-05-09 14.26.31.png

写真の通り、
1回目の
[2] pry(main)> posts[1].comments.first.user.nameの時には

  Comment Load (0.4ms)  SELECT  `comments`.* FROM `comments` WHERE `comments`.`post_id` = 2  ORDER BY `comments`.`id` ASC LIMIT 1
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1

が吐かれるのですが

[3] pry(main)> posts[1].commentsのようにコメントたちを取得した後の

2回目の
[4] pry(main)> posts[1].comments.first.user.nameの時には

User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1

しか吐かれません!

おおおってなりました笑
(rails特有のものでなく、sqlだったらあたりまえの内容だったらごめんなさい!)

結果

アソシエーションやっぱり便利だなと思いつつ、特別な事をやってるわけじゃないんだなって印象。
だから、reactでアソシエーションっぽく使うのは難しそうなので、普通にajaxでparameter投げて取得するのがいいかもしれない…!

10
11
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
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?