Lei's Notebook

insert_allやupdate_allを使って、SQLクエリの発行を削減する

今回は東京都知事杯ハッカソンに参加して、二日間のチームワークの下で、なんと投票マッチングアプリのMVPが出来上がった。 ただ、小さいアプリだけどめっちゃSQL走っていると気がついたので、もっと改善できないかなと思った。 コード全体をもう一度整理して、特にSQL大量発行する箇所に目を留めた。 ユーザーと政党テーブル、質問テーブルを紐付けるところ ユーザーの選択回答を保存するところ ...

ActiveModelでは`text`型は指定不可のことについて

今回のFormObjectでうっかりbodyのタイプをtextに指定してしまい、Unknown type :textのエラーが出た。 調べたら、ActiveModelではtextタイプをサポートしてないことがわかった。 サポートしているタイプはドキュメントでの明確な説明は見つからなかったが、ソースコードでのファイル名を見れば何とか推測できる Rails APIでのファイル名リストを見ると、...

単一テーブル継承(STI)について

応用篇でのtaxonomiesテーブルは何なんだって気になってて、調べてみたら、単一テーブル継承(STI)で使ってるテーブルのことがわかった。 同じ親クラスから継承している複数の子モデルの情報は各自のテーブルではなく、全てを親モデルのテーブルに記入する。 各子モデルの情報はtypeコラムで標識する。 今回はauthor, category, tagの三つのモデルの情報をtaxonomie...

Capybaraで新しいwindowを指定するため、window contextを切り替える方法

Capybara で system テストを行った時、can't find element'のエラーが出た。 byebugとpage.body`で確認したら、リンクをクリックした前のページに止まっていることがわかった。 調べてみたら、その原因はページ内のリンクをクリックして、新規 window/tab で開く場合は、window contextは自動切り替えがなく、前のページに止まること。...

Deviseやsorceryを使わないやり方で、パスワードリセット機能の流れを理解する

SorceryのReset passwordモジュールを使って、パスワードリセット機能を実装するという課題だったが、sorceryの手順でなんとなくできたけど、メソッドの意味や流れがなかなかうまく理解できなかった。 それで補充情報を検索してみたら、gemを使わないやり方のyoutube解説動画を見つけた。 必要最小限のコードでパスワードリセット機能を作りながら、大体の流れを理解できてから...

No newline at end of fileエラーについて

毎回Lintチェックで怒られたエラー.. なんで最後に新しい行が必要なの?と調べたら、理解が全然間違った。。 ここのnewlineは新しい行の’new line’ではなく、newline記号のことだ。 いわゆる行末記号(改行記号とも言われるらしい) No newline at end of fileは末尾に新しい行がないではなく、末尾に行末記号がないという理解の方がより正しい。 ne...

RailsでのN+1問題の原因と対策

N+1問題の原因 Lazy loading の設計で、テーブル情報が必要になった時だけ、SQLクエリを発行して取得する。 そのせいで、投稿一覧画面を表示するとき、個々の投稿の表示が処理されるたびに、ユーザー情報を取得するSQLクエリが発行されることになる。 n個の投稿があるなら、ユーザー情報を取得するクエリがn回発行される SELECT "users".* FROM "users" W...