# 高橋さん技術対策 ## N+1問題が起きるようなRailsのコード例 #### 高橋さん回答 ```ruby= @boards = Board.all ~~~~~~~ ``` viewの処理 <%= render @boards %> ## LINEのようなアプリのテーブル設計 ### 要件 - チャットができる - グループチャットもできる - テキストメッセージだけできればOK(スタンプや画像などは考慮しなくて良い) #### 高橋さん回答 users - id - name - email messages - id - body - user_id groups - id - user_id ### 追加要件 - 既読管理ができる #### 高橋さん回答 already_reads - user_id - message_id - created_at ### さらに追加要件 こんなグループがあったとする。 ``` RUNTEQグループ Aさん「こんにちはー!」(messages) Bさん「こんにちはー!」(messages) Cさん「Hello!」(messages) ``` 高橋さんはLINEを開きました。チャットルーム一覧画面には上記のRUNTEQグループが表示されています。未読バッジが3件表示されています。 高橋さんはそのチャットを見るために詳細画面に遷移しようとしました。その際のロジックはどうなりそう? エンドポイントは以下と仮定する。 ``` GET /chatrooms/:id ``` また要件としては - そのチャット内のメッセージを全て取得する - そのチャット内のメッセージを全て既読状態にする Rails(ruby)のコードを書いてください。どんなコントローラ?どんなアクション?どんなコード? 例 ```ruby= class UsersController < ApplicationController def new @user = User.new @user.save end end ``` ```ruby= class MessagesController < ApplicationController def @group = Message.find_by(params[:group_id]) @messages = @group. end end ``` ## Qiitaのようなブログアプリのテーブル設計 ### 要件 - 記事を作成できる - 記事にタグづけができる - 記事にコメントができる - LGTMができる - ストックができる #### 高橋さん回答 ## RubyでFizzBuzz ### 要件 - 1~任意の数までの数字を順番に表示する - ただし、3の倍数のときはFizz!、5の倍数のときはBuzz!、3と5の公倍数のときはFizzBuzz!と表示する。 ### 入力例 ```ruby fizz_buzz(30) ``` ### 出力例 ``` 1 2 "Fizz!" 4 "Buzz!" "Fizz!" 7 8 "Fizz!" "Buzz!" 11 "Fizz!" 13 14 "FizzBuzz!" 16 17 "Fizz!" 19 "Buzz!" "Fizz!" 22 23 "Fizz!" "Buzz!" 26 "Fizz!" 28 29 "FizzBuzz!" ``` `puts`メソッドを使うと標準出力に出力できます。 #### 高橋さん回答 ```ruby= def fizz_buzz(number) 1.upto(number) do |i| if i%15 == 0 puts 'FizzBuzz!' elsif i%5 == 0 puts 'Buzz!' elsif i%3 == 0 puts 'Fizz!' else puts i end end end ``` --- # 以下解説 ```ruby= @boards = Board.all @boards.each do |board| p board.user.name end ``` ``` SELECT * FROM boards; SELECT * FROM users where users.id = 1; SELECT * FROM users where users.id = 2; SELECT * FROM users where users.id = 3; SELECT * FROM users where users.id = 4; SELECT * FROM users where users.id = 5; SELECT * FROM users where users.id = 6; ``` ## LINEアプリ users - id - name - email messages - id - body - user_id - group_id groups - id - name user_groups - id - user_id - group_id read_messages - id - user_id - message_id もしくは user_groups - id - user_id - group_id - last_read_at (2021/8/10/12:00) ```ruby= class ChatroomsController < ApplicationController def show @group = Group.find(params[:id]) @group.messages.each do |message| # パフォーマンスは悪いがこんな風に書ける ReadMessage.find_or_create_by(message_id: message.id, user_id: current_user.id) end end end ```