Rails関連のことを調べてみた2021年12月02日

Rails関連のことを調べてみた2021年12月02日

preload, eager_load, includesについて

# はじめに
株式会社じげんでエンジニアをしているiLLviAです。

パフォーマンス低下につながる「N+1」問題。これを解消するメソッドとしてActiveRecordには`preload`, `eager_load`, `includes`が用意されています。
これらの各メソッドが「どのような挙動をするのか」「どのような場面で使い分けるのか」など理解せず雰囲気で`includes`を多用していたので、理解を深めるためにまとめてみました。

# 関連付け
`Article`は、中間テーブル`ArticleTag`を介して「Ruby」「JavaScript」「PHP」などの複数の`Tag`と紐づいています。
### **Model**

“`ruby
class Article < ApplicationRecord has_many: :article_tags has_many: :tags, through: :article_tags end class Tag < ApplicationRecord has_many: :article_tags has_

元記事を表示

自動車の品質管理からエンジニアになってみて

## はじめに
未経験からエンジニアに転職して、現在はフリーランスエンジニアとして活動しています。
エンジニアになった経緯などを書きますので、エンジニア転職を検討している方の参考になれば幸いです!

⬇️僕の経歴です

|年月|所属|
|—|—|
|2018/04~2020/04|自動車会社(新卒入社)|
|2019/05~2019/10|Progate, Railsチュートリアルで独学|
|2019/11~2020/02|ポテパンキャンプ|
|2020/04~2021/10|受託会社で正社員|
|2021/11~|自社開発会社でフリーランス|

## 1. 前職の内容
前職の自動車メーカーでは、海外の自動車のリコールなどを扱う品質管理の部門にいました。

品質管理といっても実際に、製品を扱ったり、図面を書いたりするわけではなく、
海外のお客様・研究所・部品メーカーの間に入って、スケジュールの調整を行う中間部門でした。

具体的には下記のような仕事の流れでした。

お客様から訴えがある
➡️ 過去に同じ問題がないかをデータで調べる
➡️ 同じ問題が多発していれば、研究所・工場や

元記事を表示

「ロジックをモデルに移す」よりシンプルなファットコントローラの解消法【個人開発で学んだこと】

# 記事を読むのにかかる時間
約10分

# 結論
コントローラの記述が膨れ上がってしまう、いわゆる**「ファットコントローラ」**について、
最もオーソドックスな解消法として挙げられる「ロジックをモデルに移す」よりシンプルなのは
**「テーブル設計を工夫し、そもそもコントローラに何も書かなくて良い状態を作る」**
ことだと思います。
今回、個人開発でその体験ができたので共有します。

# この記事から得られること
実装の前段階にあたる**テーブル設計**を工夫することで
コードをシンプルにする方法を一つ知ることができる。

# 必要なRailsの予備知識
・一般的なCRUDのアクション
・多対多の関連付け(`has_many :through`とか`belongs_to`)の概要
・enum

# 目次
[結論](#結論)
[開発したサービス](#開発したサービス)
[テーブル設計で工夫したこと](#テーブル設計で工夫したこと)
[詳しく](#詳しく)
[まとめ](#まとめ)
[最後に](#最後に)

# 開発したサービス

https://bachelor-derby4.herok

元記事を表示

【Rails】モデルとテーブルの関係について【初学者の疑問点を簡潔に】

## はじめに
 本記事は、Railsの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
 今回の疑問点は、

  ・モデルとテーブルの関係
 
 です。 

 現在、Twitterクローンを作成しており、フォロー/フォロワー機能の実装の際にアソシエーションの上記について疑問を抱きました。
 
## 疑問点についての解説

#### モデルとテーブルの関係について
**結論:テーブルとコントローラをモデルがつなぎ、モデルとテーブルの関連付けは、それぞれの名前によってRailsが自動的に行う。**

 モデルとは
 モデルとは、コントローラとテーブルとの繋ぎ役です。コントローラから指示を受けてデータベースとの間で情報のやり取りを行います。簡単に表すと以下の通りです。  
  
     コントローラ ⇄ モデル ⇄

元記事を表示

【IT業界未経験】テックキャンプからエンジニア職に就職するまでの記録

#はじめに
2021年3月から学習を始めて内定をもらうまでの記録をまとめました。
参考にして頂けれる所とこれは参考にならないなど反面教師にして頂ければ幸いです。

| 章 | 内容 |
|—|—|
|簡単な経歴|[自己紹介](https://qiita.com/N396184501/items/88ac98c8e83b47df6187#%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8B)|
|学習から内定までの道のり|[時系列にまとめています](https://qiita.com/N396184501/items/88ac98c8e83b47df6187#%E5%AD%A6%E7%BF%92%E3%81%8B%E3%82%89%E5%86%85%E5%AE%9A%E3%81%BE%E3%81%A7%E3%81%AE%E9%81%93%E3%81%AE%E3%82%8A)|
|転職活動内容|[実績と面接等について](https://qiita.com/N396184501/items/88ac98c8e83b47df6187#%E8%BB%A2%E8%81%

元記事を表示

【RSpec】JSONの値を確認するテスト

##環境
Ruby 3.0.2
Rails 6.1.4.1

##APIのリクエストテスト
gemを使わずにjsonが期待通りに取れているかのテストを書くとこうなる。

“`ruby
describe “GET /api/v1/fruits” do
subject { get ‘/api/v1/fruits’, headers: headers }
let!(:available_fruits1) { create(:fruit) }
let!(:available_fruits2) { create(:fruit) }
let!(:unavailable_fruits) { create(:fruit, :unavailable) }

it ‘旬の果物を返すこと’ do
subject
json = JSON.parse(response.body)
expect(response.status).to eq 200

# 果物が3つあり、そのうち旬の果物が2つ、旬じゃないのが1つ。jsonで取れるのは果物が2つ

元記事を表示

Gitサーバーが搭載された楽譜共有WEBサービスを作成した

# 楽譜共有WEBサービスを作成した

## 概要

「楽譜を共有する」サービスを作った。
既存サービスと異なる点

– 基本的にコードで楽譜を記述する
– Gitサーバーが搭載されているので、楽譜の間違いなどを修正することが容易
– アーティスト情報や曲情報を整理できるようになっている
– 例) 「凛として時雨」「TK from 凛として時雨」「Ling tosite Sigure」どれ…?
– 翻訳機能がついている

それを作るにあたって、困ったこと、工夫した点、使用した技術、などをまとめたいと思います。
※語彙力ないです
[alphaTab](https://github.com/CoderLine/alphaTab)様の恩恵が非常に大きいです

## 自己紹介

– 大学3年生
– 都内在住
– WEBエンジニア

はじめまして。私は主にWEB系の開発を行っています。
プログラミングは大学1年生の時にRailsTutorialに入門しました。
今は、RailsとReactをメインで開発を行っています。

## 今回使用した技術

### STAVE Editor

元記事を表示

細かいつまずいたことをメモしておく(11月編)

# はじめに

11月の個人的につまったところのメモになります。
Qiitaに記事にするほどでもないかなというものを自分用にまとめています。

今月は大した作業はなく問題は少なかったです。

# 問題

## 1. なぜか子モデルが作成されず、モデル名_idがないと言われた

“`
class_room.build_member(number: row[:number])
“`

rowはExcelのファイルをhash形式にした各行を表しています。
ここで、class_roomをsaveすると、member_idがないというSQLエラーが出ます。

原因は、row[:number]がinteger型で送られてくるのに対して、numberカラムのバリデーションで`string`になっていたことから`member`の作成ができずに、(エラーは起きるが)class_roomが作成されるため、参照するmemberがないので怒られていた。

“`
class_room.build_member(number: row[:number].to_s)
“`

とすることで解決した。

##

元記事を表示

レガシーシステムからの脱却

# 前書き
昨年に引き続き、今年もKITのアドカレの記事を書いていきます。
……他に話すべきこともないので早速初めましょうか。

# レガシーシステムの闇
私がアサインされたプロジェクトではRailsでWebアプリを開発していました。最初のリリースが行われたのは5年前だったため、古いプロジェクトではありませんでした。
また、実際にそのアプリが動いているサイトにアクセスしてみたりもしましたが、怪しい様子はありませんでした……あくまでユーザ側から見れば…。

## あるとき闇に気付く
環境構築をしていたとき、異変に気付きます。

* CIが数年前から失敗してるけど、設定ミスかな
* 今使ってるRubyが数年前からEOFになってる…
* 更新されないGemfile
* テストどこ…?
* slimファイルでごり押しされたレイアウト

ここから開発チームの戦いが始まりました。

### 1. CIが何年も前から失敗している
CIツールのバージョンが更新されていないのが原因でした。
イシューは立っていたものの、誰もその問題に対処していませんでした。

### 2. Rubyのバージョンが古い
R

元記事を表示

bundle installで失敗する

# 問題
– Rails Tutorial (5.1) 第1章 1.3.1
– `bundle install` しようとすると以下のようなエラーが出る

“`
Fetching gem metadata from https://rubygems.org/…………
You have requested:
spring = 2.0.2

The bundle currently has spring locked at 2.1.1.
Try running `bundle update spring`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
“`

– 書いてあるとおりに `bundle update spring` をしてもまたエラー

“`
Fetching gem metadata from https://rubygems.org/…………
Resolving dependenc

元記事を表示

rbenvでglobalを使ってもバージョンが切り替わらない

# 原因
– ホームディレクトリに `.ruby-version` ファイルがあるため
– ホームディレクトリで `rbenv local` コマンドを使ったのが原因
– おそらくglobalよりもlocalが優先され、ホームディレクトリでlocalが設定されているので強制的に常にlocalが指定されている状況になっていた

# 解決法
– ホームディレクトリの `.ruby-version` フォルダを削除し、再びglobalで再設定する

“`zsh
$ cat ~/.ruby-version
$ rm ~/.ruby-version
$ rbenv global <バージョン>
“`

# 参考
– [【Ruby】rbenv global してもバージョンが変らない|鹿せんべいとエンジニア](https://shikasen-engineer.com/rbenv_global/)
– [[初期設定]なぜ「.ruby-version」を作成するのか? – Qiita](https://qiita.com/shimadama/items/74033b932800bb61b3f3)

元記事を表示

【初心者向け】Railsでのタスク定期実行方法

###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
・clockwork 2.0.4
・本番環境 Heroku
###■Railsでのタスク定期実行方法(開発環境)
####状況
Railsアプリケーション上でタスクを定期実行したい。
そして、Windows環境ではgem「whenever」は使用できないため、gem「clockwork」をインストールし目的を達成する。
####作業内容
1)gem「clockwork」をインストール

“`ruby:Gemfile
gem ‘clockwork’
“`

“`ruby:ターミナル
bundle install
“`

2)タスクファイルを作成
「config\clock.rb」のように、任意の階層・ファイルを作成する。

3)タスクファイルの内容を記載

“`ruby:config\clock.rb
require ‘clockwork’

require File.expand_path(‘../boot’, __FILE__)
require File.expand_pat

元記事を表示

【初心者向け】MechanizeでJavaScriptの箇所を読み取れない

###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
・Mechanize 2.8.2
###■MechanizeでJavaScriptの箇所を読み取れない
####状況
Railsアプリケーションでgem「Mechanize」を使用し、Webスクレイピングを行っている。
しかし、HTMLファイル内のJavaScriptの箇所だけ読み取れない(パースできない)。
####原因
MechanizeはJavaScript未対応
####対処1
MechanizeではなくSeleniumなどを使用

https://iwathi3.hatenablog.com/entry/web_scraping_Ruby_Selenium

####対処2
JavaScriptが行うはずの処理をRubyで置き換える。
ただし、そのためにはJavaScriptの内容を読み解く能力が必要。

https://www.ownway.info/Ruby/mechanize/against_javascript

####対処3
HTMLファイル内のscriptタグを削

元記事を表示

【Ruby on rails】 記事閲覧数を表示させる

ホームページ閲覧数を表示させる機能を追加

ruby 2.6.3p62
rails 5.2.6

# 1.新規実行内容

Gemfileに以下を追記

“`
gem ‘impressionist’, ‘~>1.6.1’
“`

railsバージョンとimpressionistバージョンによっては
エラーが発生するので注意

“`
bundle install
“`

“`
rails g impressionist
“`

impressionistテーブルを作ると以下が自動で作成されますが
使うのは1カラム(session_hash)である

“`create_impressions_table.rb
class CreateImpressionsTable < ActiveRecord::Migration[5.2] def self.up create_table :impressions, :force => true do |t|
t.string :impressionable_type
t.integer :impress

元記事を表示

[Rails]Chartkick×Chart.jsで面グラフ(Area chart)を作成する

# はじめに
面グラフとは、
折れ線グラフを塗りつぶしたグラフです。こんなグラフ。
![面グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882861/5973dbe8-0337-688f-6fa3-dee39465802d.png)

Railsでグラフを表示するには Chartkick がとても便利。
デザインが綺麗で扱いやすい Chart.js と組み合わせてグラフを作っていきます。

# 環境
Rails 6.1.3
Ruby 2.7.2

# インストール 
“`ruby:Gemfile
gem “chartkick”
“`
“`console:ターミナル
bundle install
yarn add chartkick chart.js
“`
“`js:app/javascript/packs/application.js
import “chartkick/chart.js”
“`
これで導入は完了です。

# 実装
## 1. データの準備
“`ruby:mode

元記事を表示

I18nを使いながらPCでもスマホでも狙ったところでレスポンシブに改行する

## やりたいこと
Railsでガチでフランス語のアプリを個人開発しています。:fr:

タイトルや文章をブラウザで表示したいとき、PCブラウザは横に長いから改行は要らないが、スマホブラウザでは改行を入れないと見栄えが悪いってことあると思います。しかもお任せしちゃうと「いや、そこで改行しないで…、ダサい!」ってところで改行してくれてしまいます。

こんな感じで↓

![minnfra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/0c69a449-a472-f955-e0dd-aaa4564d7bd6.png)

これをPCブラウザの時は、
>ようこそ「みんなでフランス語」へ
みんなでフランス語、日本語の知識を共有しましょう

スマホの時は、

>ようこそ
「みんなでフランス語」へ
みんなでフランス語、日本語の知識を
共有しましょう

という具合で改行したいです。

HTMLで`
`タグを仕込んで、CSS側の`display`とメディアクエリを活用して制御すれば良いかと思ったので

元記事を表示

Railsである程度実装ができるようになったら

# はじめに
記念すべき DMM WEBCAMP Advent Calendar 2021 :christmas_tree: 1日目を担当します @SawaShuyaです!

Railsで開発を進めていると、3~4カ月ほどで設計から実装まである程度自力で開発できるようになってくると思います!
今回は、railsをある程度自力で書くことができるようになった方向けに、次にどのようなことを学んでいけばいいのかを書いていきたいと思います:shamrock:

構成は
1. rubyを学ぶ
2. railsの開発スキルを磨く
3. 周辺知識を学ぶ
となっておりますので、興味のある部分だけでも見ていただけたらと思います!

# 1. Rubyを学ぶ
railsはすべてrubyで書かれてます。rubyを深めていくことで、これまでは何気なく扱っていたclassやmodule、オブジェクトなどを理解することができ、より効率の良い開発ができるようになります!

では

元記事を表示

Apple silicon (M1 Max)でMailCatcherをインストールする

M1 MacでMailCatcher( https://mailcatcher.me/ )をインストールしようとした際にちょっとつまづいたので、解決策を備忘録的に。

# 環境

* MacBook Pro (2021)
* M1 Max
* macOS Monterey v12.0.1
* ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.arm64e-darwin21]

# うまくいかなかった時

普通にMailCatcherのサイトにあるように

“`
% gem install mailcatcher
“`

を叩いたら

“`
ERROR: While executing gem … (Gem::FilePermissionError)
You don’t have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
“`

とパーミッションエラーが出たので、「あちゃ、ヤベヤベ……」と`sudo`つけて再度`gem inst

元記事を表示

【オブジェクト指向】カプセル化

##カプセル化
オブジェクト同士の紐付き(関係性)を薄くし、独立性を高め、再利用や交換といった保守性を高める効率の考え方。

“`ruby
class Foo
def initialize(foo=’foo’, bar=’bar’)
@foo = foo
@bar = bar
end
end

f = Foo.new
f.foo
#=> NoMethodError: undefined method `foo’ for #
“`

– “`attr_accessor :foo, :bar“`と書くだけでインスタンス変数“`@foo“`と“`@bar“`にアクセスできるように

“`ruby
class Foo
attr_accessor :foo, :bar
def initialize(foo=’foo’, bar=’bar’)
@foo = foo
@bar = bar
end
end

元記事を表示

【Ruby】メソッドのオーバーライド

##メソッドのオーバーライド

親クラスを継承した子クラスで同じメソッドを定義するとメソッドがオーバーライドされる。

“`ruby
class Parent
def talk
puts ‘早く寝なさい’
end
end

class Child < Parent def talk puts '眠い' end end p = Parent.new p.talk #=> 早く寝なさい

p = Child.new
p.talk
#=> 眠い
“`

##super
オーバーライドされる前のメソッドを呼び出すことができるメソッド。
“`super“`で親クラスの“`talk“`メソッドを呼び出している。

“`ruby
class Parent
def talk
puts ‘早く寝なさい’
end
end

class Child < Parent def talk super puts '眠い' end end p.talk #=> 早く寝なさい
#=> 眠い
“`

##参考

https:

元記事を表示

OTHERカテゴリの最新記事