最近は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
Post Load (0.7ms) SELECT `posts`.* FROM `posts`
belongs_to
posts[2].user
User Load (8.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
has_many
posts[2].comments
Comment Load (0.4ms) SELECT `comments`.* FROM `comments` WHERE `comments`.`post_id` = 4
has_many & first & belongs_to
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
キャッシュ機構
写真の通り、
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投げて取得するのがいいかもしれない…!