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

Rails関連のことを調べてみた2022年12月29日
目次

SQLでバルクインサートを使ってテストデータを大量に作成する

# この記事を書いた背景
RailsのAPIモードで開発していたのですが、動作確認のためステージング環境にテストデータを大量に作成する必要がありました。

その際、Railsコンソールからデータを増やそうと思い`each`で繰り返しデータの生成を実行したのですが、herokuのプランの都合上1時間に発行できるクエリ数が3,600に限られており、それがオーバーしたようでデータの作成が途中で終わってしまいました(泣)

しかも、一度クエリの上限数を超えると1時間ほどDBにアクセスできなくなるという問題も、、、
(現在は有料プランに切り替えたので恐らく問題ないですが、当時は無料プランだったためこうした制限に引っ掛かりました)

参考:https://zenn.dev/ttskch/articles/905ae809e29504

– 急に有料プランに切り替えたくても自社持ちの費用でないため承認まで時間がかかる可能性があること、
– リリースまで時間がなく、なるべくすぐにステージング環境で動作検証をしたかったこと
このような理由から、herokuが復旧後、SQLでバルクインサートを行い発行する

元記事を表示

(備忘録)AWSのS3を使い、画像をアップロードする方法

# データの保管とは?
* Webアプリケーションでは、毎日たくさんのユーザーより写真や動画がアップロードされてる。
* そのデータはユーザーがいつでも見返すことができるように蓄積しないといけない。
* その時、使うサービスを「ストレージサービス」という。

# ストレージサービスとは?
* インターネット上でデータを保存する場所を提供するサービス
* AmazonのS3はその体表的なサービス提供者

# Heroku、Renderなど、デプロイサイト利用(経由)し、リリースしたサイトに関して、ストレージサービスが必要となる理由
* Userがアップロードした画像などデータは、アプリがデプロイまたは再起動(自動更新)される度に、消えてしまう仕様になっている為
* 但し、有料バージョンはその限りではない。

# AWS、S3の無料使用期間
* 12ヶ月間、一定の使用量までは無料で利用できる
→S3の場合、以下が無料で使える
①5GBの容量
②20,000 件のGetリクエスト
③2,000 件のPutリクエスト
※今後変わる可能性はあり

* 無料枠でS3を利用する際は以下に注意
①不

元記事を表示

Railsでポートフォリオ制作③【実装:GitHubにあげる〜ユーザー機能実装】

ポートフォリオの環境構築が完了したので、実装に入ります。

## これまで
https://qiita.com/mahariiku/items/1f062eed36dab8ace782

https://qiita.com/mahariiku/items/31a741d478004598b995

## 実装手順
– GitHubに上げる
– issueを作っていく
– gemのインストールと各種設定
– GitHub Actionsを導入
– Dockerを導入
– タイムゾーンの設定
– devise(ユーザー認証gem)の導入
– 国際化(localize)
– UIのテンプレートを導入
– ユーザー関連機能のviewとspec実装

## GitHubに上げる
– GitHubのマイページで、リポジトリの新規作成
– ローカルのrailsプロジェクトのディレクトリで`add`→`commit`→`remote add`→`push`
– GitHubのリポジトリページを更新してローカルの内容がプッシュされているのを確認!
![スクリーンショット 2022-11-12 7.10.

元記事を表示

[Ruby on rails] 駆け出しエンジニアの「なんでこの名前なん?」4選

どうも、9月に入社しました駆け出しエンジニア(4か月)です。
この記事では、僕が「**え、それそういう由来だったのね**」と思ったIT用語や略語を4つまとめてみたいと思います。
漠然とした機能に加え、その語の由来やニュアンスを的確に捉えることができれば初学者はよりスムーズに、経験者はより深く用語について理解できるのではないでしょうか。
尚、以下は完全なる僕の主観に基づいた情報であり、現状の僕の用語に対する理解です。
間違い、補足等あれば都度コメントいただけると幸いです。
それではスタートです。
※Ruby on Railsを主に触っている前提です。
# erb
これは”Embedded RuBy”の略です。日本語に訳すと、「**埋められたruby**」。
よくHTMLファイルなどで見かかけますね。
〇〇.html.erbのような感じです。つまり、「rubyが埋められたHTMLファイル」だよ!ってことを示してくれています。「あれ、、rubyが読み込まれてない、、」なんてことが起きた時は拡張子がきちんと「.erb」になっていなかった。なんてことはよくあるので、よくよく確かめてみるべきだ

元記事を表示

Ruby on Rails + Vue.js + AWS Fargate + Circle CiでSPAアプリを作成してみた

## はじめに
最近、と言ってもこのアプリを作ったのは2021年終わりから2022年前半くらいになるのですが、
未経験エンジニアのポートフォリオのレベルがだいぶ上がっているという話を耳にすることが多く、未経験で業界に飛び込んだ自分も負けていられないなという思いから業務後にコツコツアプリを作ってみました。

先に言い訳をしておくと、転職活動中だったこともあり`Terraform`でインフラのコード化までやり切ることができず、テストコードも未実装というかなりお粗末なアプリになってしまいました。反省。。。
ただ、業務と並行して未経験の技術をキャッチアップしていたことが転職面接時には結構ウケが良かったので、ある程度プラス評価はしてもらったかなと思っています。
あとシンプルに自分の作りたいものが形になっていくのはやっぱり楽しい

【Rails】HERE Maps APIで地図機能を作ってみる

# 概要
今回、無料でMap機能が使えるかつGoogleMapのAPIよりすごい!という話を
[以下の記事](https://qiita.com/Akira-Isegawa/items/a31be5893e362c6f10c3)で見かけたので、Railsで実装してみました!
投稿機能を実装していれば実装できる機能なので、ぜひ遊んでみてください〜!

https://qiita.com/Akira-Isegawa/items/a31be5893e362c6f10c3

:::note warn
投稿機能の実装が必要です
:::

# アカウント登録とプロジェクトの作成
以下の記事にある、`Developerの登録`を参考に進めましょう!

https://qiita.com/Akira-Isegawa/items/a31be5893e362c6f10c3

上記の記事のようにプロジェクトの作成が終わったら
アプリのディレクトリ直下(Gemfileと同じ階層)に`.env`という名前のファイルを作成し
APIキーを`.env`に入れます。

“`:.env
HERE_MAP_API_KE

CloudWatchでRailsアプリケーションログの10秒以上の処理を抽出するフィルタの書き方

# はじめに
医療系クラウドサービスを提供しているレイヤードという会社で働いています。

今回あるサービスのデータベースにおいて`Lock wait timeout exceeded`が発生し、やたら処理時間が長いヤツがいそうだゾ(しかもトランザクションかけてやがる!)、という事で犯人捜しをした時のメモです。

AWSのClowdWatchでRailsのproductionログを対象に「◯秒以上の処理」を検索しました(しょーもなくてごめんなさいw)。
RailsのログでなくてもDBやWebサーバのログ検索も同様に使えると思います。

# 前提
当然ながらClowdWatchにログを上げている前提です。
Railsのログは下図のようになっており矢印のms箇所を検索します。
[![Image from Gyazo](https://i.gyazo.com/38b43cfc7f81df1c54d564b685b6aee9.png)](https://gyazo.com/38b43cfc7f81df1c54d564b685b6aee9)

# 手順
– ClowdWatchの画面で「ログのイン

Railsでセキュアなパスワードを実装する方法[備忘録]

セキュアなパスワードを実装する

ユーザ認証について

ユーザ認証は以下の手順で行われます。

  1. パスワードの送信。
  2. ハッシュ化(ハッシュ関数を使って入力されたデータを不可逆なデータにする。)
  3. データベース内のハッシュ化された値との比較

今回は特にパスワードのハッシュ化の実装について学んだことを残しておこうと思います。

has_secure_password

ハッシュ化されたパスワードを実装する時は、has_secure_passwordメソッドを使います。

このメソッドを使用すると以下のことができるようになります。

  1. ハッシュ化したパスワードを、データベース内のpassword_digestという属性に保存できるようになる。
  2. authenticateメソッドが使えるようになる。(引数に正しいパスワードを入力すると、正しいユーザ情報を返し、間違ったパスワードだとfalseを返すメソッド)

【覚悟】find, find_by, whereの違い【備忘録】

# find, find_by, whereの違い
この前足元をすくわれたので、もう間違えないという覚悟の備忘録。
基礎的な内容だからこそ今一度。

## findメソッド
**モデルのidで検索してデータを取得できる。**
idでしか検索ができないため、取得対象のデータのidが具体的にわかっている場面で使用する。

該当するデータが存在しない場合は、`ActiveRecord::RecordNotFound`が返ってくる。

## find_byメソッド
**モデルのid以外でも検索条件としてデータを取得できる。**
複数条件を指定できるが、返ってくるデータは最初にヒットした1件のみ

該当するデータがない場合は、`nil`が返ってくる。

## whereメソッド
**モデルのid以外でも検索条件としてデータを取得できる。**
該当するデータが全て返ってくる。

該当するデータがない場合は、空の配列が返ってくる。

### 注意
**whereはActiveRecord::Relationを返す**。これは検索クエリを組み立てるもので、find, find_byの返す検索結果のオ

ActiveRecordっぽくFirestoreを操作できるgemを作りました(ActAsFireRecordBeta)

## はじめに
ActiveRecordっぽくFirestoreを操作できるgemを作りました。

https://github.com/JunichiIto/act_as_fire_record_beta

## 概要

こんなモデルを定義します。

“`ruby
class Book
include ActAsFireRecordBeta

# 属性の名前と型を定義
firestore_attribute :title, :string
firestore_attribute :published_on, :date
firestore_attribute :page, :integer

# 必要に応じてバリデーションも追加
validates :title, presence: true
end
“`

CRUDする例です。

“`ruby
# Create
book = Book.new(title: ‘An Awesome Book’, published_on: ‘2022-12-01’.to_date, page: 200)
boo

Ruby on Railsでプルダウン検索機能を実装する(gem不使用)


こんにちは。GeekSalonのプログラミング駆け出しメンターです。
今日はgem(ransack)を使用せずに実装できるプルダウン検索機能についての記事を書こうと思います。
初めて記事を書くので、温かい目で見てくださると嬉しいです。

# 目次
①前提
②開発概要
③実際のコード

## 前提
○開発環境
Ruby 3.0.4
Rails 6.1.6

○前提
・ ListでのCRUD機能実装済み
・ 新規投稿ページでプルダウン機能を実装

## 開発概要
①投稿時にプルダウンで選択した情報を、変数を使って検索をプルダウン式でかける。
②検索用のparamsをコントローラーで作成
・検索したいカラムの選択項目を検索バーにも作成する
③コントローラーで検索した結果だけを表示する変数を作る
・ビューに表示

実装イメージはこちら

ー投稿一覧ページー
![スクリーンショット 2022-12-27 15.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.co

【Rails】なぜcountよりもsizeを使うべきなのか?〜lengthの動きも一緒に確認〜

## 1. はじめに
パフォーマンス向上を考える時、“count“より“size“を使おうという話はよく耳にする。
「“size“だとクエリを毎回発行しないから良いんでしょ」くらいのことは知っていても、実際それぞれのメソッドがどんな挙動をしていて、どう使い分けたら良いかあまり意識せずなんとなくで使っている人は多いのではないだろうか

この記事では実際に3つのメソッドの動きを確認し、「なぜ“count“よりも“size“を使うべき」と言われているのか、また同時にどういう場合にどのメソッドを使ったら良いのかを考えてみたい

## 2. countメソッド
– SQLのCOUNTを使う
– キャッシュの有無に関係なく、毎回クエリを発行する
[GitHub](https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activerecord/lib/active_record/relation/calculations.rb#L43-L53)

“`console:conso

[Rails,slick,JavaScript]slickを用いたスライドショーの作成

チーム開発で活用した技術をアウトプット投稿
## 目的
slickを用いて下記のようなスライドショーの作成
![スライドショー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950107/d04e514b-4731-1ede-58f0-43def9ce7727.gif)

## 開発環境
– Ruby 3.1.2
– Rails 6.1.7
– bootstrap併用

## 実装手順
### 1.slickの導入
今回はCDNを用いて実装

https://kenwheeler.github.io/slick/

公式HPのヘッダー`get it now`をクリックし
`View On Github`からgithubに移動し、`README`にある以下3つをコピー
“`

Rails モデルのテストコードについて[備忘録]

今回はモデルのテストについて書いていこうと思います。

この記事でわかること

  • Railsのモデルをテストする方法について。
  • ユーザ名、emailに関してテストするべきことについて。

テスト

何をテストするか

今回は、ユーザ名、emailのレコードをデータベースに保存する際に検証する必要がある以下の項目についてのテストを書いていこうと思います。

  • 有効性
  • 存在性
  • 無効性
  • 一意性

有効性のテスト

rails generateコマンドで生成されたファイルに、user.rb, user_test.rbがあります。それぞれ最初は以下のようになっています。

“`Ruby:app/models/user.rb
class User < ApplicationRecord end ``` ```Ruby:test/models/user_test.rb require '

マイグレーションを自作する

# カラムを編集する indexにする
“`rb
create_table :users do |t|
t.string :name, index: true
t.string :email, index: { unique: true, name: ‘unique_emails’ }
end
“`
# 編集したものをまた編集したいときはどうすればいいのか?
“`
bin/rails g migration ChangeNameOnProducts
“`
もう一度このカラムについて編集したくなった。
“`
************@mbp ********** % bin/rails g migration ChangeNameOnProducts
invoke active_record
conflict db/migrate/20221227074540_change_name_on_products.rb
Another migration is already named change_name_on_products: /Us

[Rails,Javascript]モーダルウィンドウの実装

チーム開発で活用しようと思った技術をアウトプット投稿
## 目的
以下のようなモーダルウィンドウの実装
商品の写真をクリックすると以下のように表示、背景の黒い部分をクリックすると戻る
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950107/b51c11a5-777b-d3f4-a5ff-cc91f28a67c4.png)

## 開発環境
– Ruby 3.1.2
– Rails 6.1.7
– bootstrap併用(bootstrap自体は実装機能と関係なし)

## 実装手順
### 1.モーダルの設置
モーダルを表示させたいページに以下の記述を行う
例)`index`ページに`show`ページの内容を表示したい場合は`index`に記述
“`(例)index.html.erb

“`
### 2.CSSの設定

[Rails,Javascript]RailsのviewでJavaScriptを用いて一定時間後に指定したページへ飛ぶ

チーム開発で活用した技術アウトプット投稿
## 目的
– 特定ページを訪れた際、一定時間後指定したページへリダイレクトする

## 開発環境
– Ruby 3.1.2
– Rails 6.1.7

## 基本的な書き方
指定したいページに下記`script`を記述

“`.js

“`
– `action`内の`window.location.href = ‘URL’;`で遷移先を指定
– `time`内の5*1000で秒数を指定(ミリ秒で指定する。1000 = 1秒)
– `setTimeout`で`time`に指定した時間経過後に`action`を実行

## 問題点
この記述をしたページから違うページに飛んだ場合でも実行されてしまう
※指摘してくれたチームメイトに感謝

例)Aboutページに指定している、指定

【Rails】相互フォロー同士のDM機能(非同期通信)

## 初めに
私は普段、適当にプログラミングを勉強している@takakouと申します。今回作成した「相互フォロー同士の「DM機能(非同期通信)」は自分のアプリに、相互フォローをしているユーザ同士の1対1のDM機能を実装したい方向けです。色々DM機能の作成方法について記事を漁ってみたのですが、相互フォローしているユーザ同士の1対1のDM機能に特化した記事が少ないと感じたため、今回の記事の執筆に至りました。

## 前提

 フォロー・フォロワー機能が実装されているという前提のもと今回の記事を執筆していきます。前提としての機能が完成していない場合は下記の@Hbk__17さんの執筆された記事を参考にしていただき、フォロー・フォロワーの機能を実装していただくことを推奨いたします。

https://qiita.com/Hbk__17/items/a6b96009154542d04269

## 動作環境
・PC : **MacBook Air(M1,2020)**
・RAM : **8GB**
・OS : **macOS Monterey(ver12.1)**
・Ruby : **3.1.

Railsでテーブル作成時にカラムの順番を指定する

## やりたいこと
MySQLの場合です。
SQLiteでもできるかも?(未検証)
PostgreSQLは少し面倒そう?https://wiki.postgresql.org/wiki/Alter_column_position/ja

Userテーブル作成時に`deleted_at`等のカラムを作りたいとします。
作成後のschemaでは以下のように`updated_at`の後ろになって欲しい場合に、どうすれば良いか。

“`ruby
create_table “users”, force: :cascade do |t|
t.string “email”, limit: 255
t.string “name”, limit: 255
t.datetime “created_at”, null: false
t.datetime “updated_at”, null: false
t.datetime “deleted_at” # updated_atの後ろ
end
“`

普通に作ると

ActionDispatch::Request::Session::DisabledSessionError: Your application has sessions disabled. To write to the session you must first configure a session storeが発生した時の対処法

# 概要
– ruby 3.1.2
– rails 7.0.4
– railsはAPIモードで利用
# 結論
config/application.rbに以下の3行を追記すれば解決する。
“`config/applicaton.rb
config.session_store :cookie_store, key: ‘_interslice_session’
config.middleware.use ActionDispatch::Cookies
config.middleware.use config.session_store, config.session_options
“`
参考になれば幸いです。
# 参考文献
– [Rails 7.0.1 with disabled Sessionstore ctionDispatch::Request::Session::DisabledSessionError (Your application has sessions disabled. To write to the session you must first configu