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

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

[Rails][Ruby] update_allとwhereを使用するとき、クエリキャッシュに気をつけよう

## はじめに
未経験からエンジニアに転職して、2ヶ月ほど経つエンジニアです。
業務にあたりながらも、小規模なアプリを作って楽しんでいます。
今回は大量のレコードをまとめて更新するときに重宝する update_all についてです。

## 結論
update_all を使用するときはクエリの実行タイミングに注意しよう。

## update_all とは
>条件に一致するレコードをSQLを直接実行して全て更新
updated_atとupdated_onは更新されない

バリデーションやトランザクションを無視する点も注意が必要です。

https://railsdoc.com/page/model_update_all

## クエリキャッシュに注意
~~~ruby
#このタイミングではクエリは走らない
users = User.where(id: XXX, status: XXX, …)

#上記 where と組み合わせて UPDATE users … FROM … WHERE … が走る
users.update_all(
status: XXX,
up

元記事を表示

Rails 投稿+タグの同時検索

# はじめに
この記事では投稿検索とタグ検索を同時に行う方法を実装しています。
投稿機能(ここではPostモデル)、そしてタグ機能を実装している前提で進めていきます。

# 完成例
![スクリーンショット 2022-06-19 073625.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2147313/84a8e42f-09b4-4cd7-2a06-e4777ff4af45.jpeg)

# 実装の流れ
1. コントローラーの編集
2. ビューページの編集

# 1. コントローラーの編集
今回はindexページに実装していきます。まずはpostコントローラーのindexアクションに投稿検索機能とタグ検索機能を追加します。

“`posts_controller.rb
class PostsController < ApplicationController #割愛 def index if params[:search].present? && params[

元記事を表示

【Rails】投稿記事の公開/非公開機能 Boolean

投稿記事に公開・非公開機能をラジオボタンで実装したので記録を残します!
間違っている箇所があればご指摘頂けると大変助かります(_ _).。o○

##### 前提
・Deviseログイン機能実装済
・Postテーブルにboolean型でカラム追加(今回のカラム名:is_published_flag)

#### Postモデルに条件式を定義

“`
/app/controllers/posts_controller.rb

class Post < ApplicationRecord belongs_to :user # 公開・非公開機能 scope :published, -> {where(is_published_flag: true)}
scope :unpublished, -> {where(is_published_flag: false)}
~省略~
end
“`
scope :スコープの名前, -> { 条件式 }
公開・非公開を見分けられるように条件式を書きます。

#### Postsコントローラー

“`
/app/contro

元記事を表示

AWS Fargateからherokuに移行した話

## はじめに
※ 自分用メモ
awsの無料期間がそろそろ切れそうなので、バックエンドをherokuに移行したお話

## 移行前
#### バックエンド
言語・フレームワーク: Ruby、 Ruby on Rails
インフラ: AWS ECS(Fargate)、ECR、Route53(ドメイン取得はお名前.com)、RDS(Mysql)無料枠があるから、Auroraではない、ALB、ACM、S3、EFS

#### フロントエンド
言語・フレームワーク: React、NextJs
インフラ: バックエンドと同じ

#### ミドルウェア
webサーバー: Nginx
DB: mysql

## 移行後
#### バックエンド
言語・フレームワーク: Ruby、 Ruby on Rails
ミドルウェア: Nginx、mysql
インフラ: heroku、jawsdb、S3

#### フロントエンド
言語・フレームワーク: React、NextJs
インフラ: vercel、Route53(ドメイン取得はお名前.com)、ACM

### バックエンド移行(aws ⇨ hero

元記事を表示

【Rails7】Rails7 Hotwire × TailwindCSS SPA風ポートフォリオor個人開発アプリの下地を作ろう!(環境構築・投稿機能作成まで)

## はじめに
未経験からエンジニアに転職して、2ヶ月ほど経つエンジニアです。
業務にあたりながらも、小規模なアプリを作って楽しんでいます。
その中で、RailsにHotwireを使用して作成したアプリが、
+ 未経験からエンジニアに転職するためのポートフォリオ
+ 個人開発のアプリ

に向いているのではないかなと思いました。

## なぜポートフォリオ or 個人開発に向いているか
**エンジニア歴2ヶ月の弱弱エンジニアの意見なので、あくまで参考程度に考えていただきたいです。**

**結論**
**フロントエンドのコードをほとんど書かなくても、SPA(シングルページアプリケーション)風のサービスを比較的簡単に作成できるからです。**

比較的というのは、VueやReactなどのフロントエンドのフレームワークを使用するより、という意味合いです。

自分自身、エンジニアに転職する時に完全SPAのポートフォリオを作成しました。
転職活動の際には、
**未経験でここまで作りきることができるのはすごい**
というような評価をもらうことが多くありました。(あくまで未経験にしては、ということで

元記事を表示

Ruby on Rails テスト環境を本番環境にしてみた

# 記事の背景
Ruby on Rails本番環境で再現していたバグをテスト環境で確認する為、テスト環境を本番環境に変更してバグ修正を試みようと思ったが、テスト環境を本番環境にするのにかなり詰まった為、記事を書いてみました。

## まず、環境を変えるとはどういうことか??
テスト環境では環境変数testで実行していたものをproductionに変える(**RAILS_ENV=test**を**RAILS_ENV=production**に変える)

## 詰まったこと
1. テスト環境で**RAILS_ENV=production**が実行出来ない。
2. コンソールが使用が出来ない。
3. テスト環境のデータベースが反映されない。
4. アセットプリコンパイルしてもcssや画像が反映されない。

# 各事象と解決方法
## ①テスト環境で**RAILS_ENV=production**が実行出来ないの解決方法
### 事象
下記コマンドを打つと、
“`
$ bundle exec rails assets:precompile RAILS_ENV=production
“`

元記事を表示

TECH CAMP12日目 ~ルーティングのネスト~

# ルーティングのネスト
– ルーティングのネストとは、段階に分けてルーティングを記述すること

__書き方の例__
“`ruby
Rails.application.routes.draw do
resources :tweets do
resources :comments, only: [:create]
end
end
“`

## メリット
– ルーティングの記述をネストさせるとURLの階層構造ができる。
上記のようにルーティングした場合のURL
`/tweets/id(数字)/comments`
このようにどのツイートに対してのコメントなのかが一目でわかる。

– パラメーターに親要素のカラムを入れることができる
ちょっと分かりにくいので使わなかったらどうなるか↓

### 使わなかったら…
例)
“`ruby
Rails.application.routes.draw do
resources :tweets
resources :comments
end
“`
“`html.erb
<%= form_with 'hoge', co

元記事を表示

Gitでプロジェクトを管理するDay3

今日はアプリ開発でタスクをまとめました。具体的には、gitでissueを作成し、今後の開発を管理していきます。issueで利用できるチェックボックについて紹介します。

# gitでチェックボックスを作成するには?
チェックボックスとは↓のようなもの。チェックをつけたり外したりできます。
![スクリーンショット 2022-06-17 21.29.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/01cefcb1-62e7-fcbe-2aba-6837d301bc08.png)
記述の仕方
“`
– [ ] ここに文章ーー
– [x] 作成時にチェックをすでに入れていたい場合はこのように記述
“`

以上でチェックボックスを作成できます。ちなみにQiita上でも
– [ ] 同様の記述でチェックボックスを作成できます。 
– [x] チェック済みボックスを作成。

以上

元記事を表示

Rails チャット機能

## はじめに
[前回、Railsアプリケーションにマッチング機能を実装しました。](https://qiita.com/gobtktk/items/5caf074209faf31cae4a)今回は、マッチング成立後のユーザー同士のチャット機能を実装していきたいと思います。

### 実装環境
Rails7.0.2
Ruby3.1.0

## メッセージ機能の仕様
ユーザー同士が、「お気に入り!」評価をしている場合(マッチング成立時)に限り、チャットができるようにします。
ユーザーは複数のチャットに参加することができます。またチャットは、2人でするものとします。

## 実装の流れ
1. マッチング成立ユーザーページの実装(viewとcontroller)
1. チャットルーム用のテーブル(chat_rooms)を作成。
1. 中間テーブル(chat_room_users)を作成
1. ルーティングの作成
1. コントローラーの作成

## マッチング成立後、ユーザーページの実装(viewとcontroller)
### 1.ルーティングの設定
~~~ruby:routes.rb
R

元記事を表示

Rails マッチング機能の実装

## はじめに
Rails でアプリケーションを作成した際に、学んだことの復習と、知識の整理のために投稿します。
### 開発環境
rails: 7.0.2
ruby: 3.0.1

## マッチング機能の仕様
ユーザーは、自分以外のユーザーであれば、何人でもlikeとdislikeすることができますし、逆もまた然りです。

## ER図
テーブルと関係性をわかりやすくするため、ER図を作成します。

スクリーンショット 2022-04-18 16.39.28.png

### likesテーブルのカラムについて
– from_user : 誰からの評価なのかを判別するためのカラム
– to_user : 誰に対しての評価なのかを判別するためのカラム
– status : 評価結果(like or dislike

元記事を表示

リプライ機能を実装するには?Day2

オリジナルアプリ開発Day2、2本目の記事です。自分のメモのために書いています。

# RDB構造でリプライ機能実装する方法は?
Twitterやyoutubeのコメント欄のように、コメントに対して、コメントをする機能をreplyと言いますが、その機能をどのようなRDB設計で再現すればいいのか考えていました。

自分が考えたものも含めて、解決策は5つ。

## 先人たちが見つけてくれた解法
・隣接リストモデル(ナイーブツリー).
・経路列挙モデル
・閉包テーブルモデル
・入れ子集合モデル

よく纏められたサイトがあったのでそちらをご紹介します。

https://www.wantedly.com/companies/tutorial/post_articles/299434

https://www.slideshare.net/kamekoopa/ss-27728799

自分ならば、上記4つの解法の中から1つ選ぶとしたら、閉包テーブルモデルを採用すると思います。

## 自分が考えた解法
コメントテーブルに対して、コメントのIDを外部キーとしたリプライテーブルを作成します。これで、

元記事を表示

TECH CAMP11日目 ~中間テーブル~

# 中間テーブルとは
・多対多の関係性があるテーブルの間に設置するテーブル
・接続する2テーブルの外部キーをもつ

分かりやすい記事↓
https://qiita.com/ramuneru/items/db43589551dd0c00fef9

## 注意
テーブル間にアソシエーションを書く時、
例)usersテーブル、tagsテーブル、tweetsテーブルがある時、

Userモデルには
`has_many :user_tweets`
`has_many :tweets, through: :user-tweets`
の順番でかく。
`has_many through`で経由するテーブルとのアソシエーションを先に記載しないとエラーになる。

元記事を表示

DBってどんな種類があるの?Day2

# 今日の問題
オリジナルアプリ開発のday2です。今日は要件定義の作成、DB設計をやっていました。Twitterのようなフォロー機能を作る時どのようなDB設計を作ればいいのかわからず、DB設計について調べました。今回はDBについてまとめます。

# DBは3種類ある
テックキャンプではRDB(リレーショナルデータベース)についてしか学びませんでしたが、DBは主に3種類あるそうです。

### 1、階層型データベース
1つの頂点(親)が存在し、その下に複数の子供、孫が結び付けられている構造です。常に親とこの関係は「親1人対子1人」か「親1人対子多」の関係しか持てません。
![絵-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/98e7b1ef-7995-1f23-b12d-6981cc154667.jpeg)
#### メリット
・「各ノード(親や子、孫などを示している丸1つ1つのこと)へのルートが決まっているので、処理速度が早くなる」というもの。
#### デメリット
・データの追

元記事を表示

database.ymlを編集する事で変えられるもの

Q.
database.ymlを編集する事で何が変わるのか?

A.
運用環境を変えられる。database.ymlで表記されている単語は下記の意味である。
development:開発
test:テスト
production:本番

Q.
そもそもなぜ変える必要があるのか?

A.
開発環境では、バグを見つけやすくするツールを導入するために必要
本番環境ではバグを見つけやすくするツールが導入されていると余計な処理が増え、処理に時間がかかる事を防ぐため

元記事を表示

【Rails】docker-compose 基本コマンド

railsコマンド

##### モデル作成
“`
docker-compose run web bundle exec rails g model モデル名 カラム
“`
モデルは単数系で頭文字は大文字٩( ‘ω’ )و

##### マイグレーション
“`
docker-compose run web bundle exec rails db:migrate
“`

##### コントローラー作成
“`
docker-compose run web bundle exec rails g controller posts new
“`

その他

##### build時にキャッシュを使わない
下記コマンドは変更内容が反映されない時に使います
“`
docker-compose build –no-cache
“`

##### dockeの中に入る
dockerのコンテナ名は docker psで確認!
“`
docker-compose exec #{container} bash
“`

##### Gem一覧確認コマンド
“`
d

元記事を表示

nested_attributesの中のattr_accessorが時々callbackを発火させない件

# TL;DR

“`rb
class User < ApplicationRecord has_many :comments, dependent: :destroy accepts_nested_attributes_for :comments, allow_destroy: true end class Comment < ApplicationRecord attribute :foo, :string after_validation do p "foo: #{foo}" end end ``` ```rb User.last.update(comments_attributes: { id: 1, foo: 'Foo' }) => true
“foo: Foo”
# この時`comment`の`updated_at`も更新されること
“`

# 発端
とあるプロジェクトがコメントの添付画像の削除機能が必要でしたが、普通に`attr_accessor :img_destroy`でフラグ置きました。
ただし実装したところ、「コメント変更

元記事を表示

rails コントローラ別 アクション別に別々のlayoutを読み込む方法(自分用)

https://www.javadrive.jp/rails/template/index3.html#section3

元記事を表示

【随時更新】RSpec でハマったエラー

### はじめに
初心者ですので、言葉足らずなところや間違えがあるかもしれません。
お気づきになりましたら、ご指摘いただけると嬉しいです。

# ログインできない

##### エラーコード
“`
Failure/Error:
expect(current_path).to eq(root_path)

expected: “/”
got: “/users/sign_in”

(compared using ==)
“`
“/”に遷移しようとしたけど、結果は”/users/sign_in”ですよ。
つまり、遷移できずにログインページのままになりエラー。
##### ソースコード(一部)
“`ruby:system/users_spec.rb
#省略

# 正しいユーザー情報を入力する
fill_in ‘email’, with: @user.email
fill_in ‘password’, with: @user.password
# ログインボタンを押す
find

元記事を表示

「まだRailsでstrftime使ってるやついる?」「いねえよなぁ!!?」【日時のフォーマットをja.ymlで管理する】

※ 結論だけ知りたいという人は[解決法](#解決法)から見てください

「まだRailsでstrftime使ってるやついる?」

「いねえよなぁ!!?」


はい、使ってます。

`strftime`を使用して、日時をフォーマットする際
“` erb:View

<%= @model.time.strftime('%Y年%m月%d日 %H時%M分') %>

“`
のように毎回記述する必要があり
「いちいち指定しなくても同じ形式でフォーマットしてほしい」
「フォーマットをまとめて管理したい」
といった悩みに苦しめられてきました。

「仕方ない」と諦めていたこの悩み…解決する方法を実は見つけてしまったのです。

私みたいに諦めてstrftimeを使っているそこの貴方、今まさにstrftimeを使おうとしているそこの貴方。
「もっと早く気づいていれば、もっといい感じにプロダクトを作れた」
と思うその前に、是非参考にしてみてください。

# strftimeとは?
strftimeは、日時のデータを指定したフォーマット文字列に変換で

元記事を表示

URLパラメータ(クエリ文字列)は文字列で取得されますよ。

先日会社でサービスの開発をしている時、URLパラメータを取得しているのに読み込まれていない事案が発生しました。
案外ミスしがちなポイントだったので記事に残します。(タイトルが結論ですが。)

# やりたかったこと
URLパラメータをインスタンス変数に入れてviewで表示内容を変えるというものです。

“`controler.rb
@user_type = params[:id] # URLパラメータの値を取得
“`

“`view.rb
<% if @user_type == "1" %>
<%= link_to %>
<% end %>
“`

# はまりポイント
はまりポイントというほどでもないですが、ちょいはまりくらいです。
URLパラメータは文字列型で取得されることです。
ですので「よし、id=1のパラメータを取得したぞぉ」といって“`if @user_type == 1“`と書いても認識されないわけです。

# まとめ
「URLパラメータは全て文字列で取得される。IntegerやArrayで使用したい場合は都度、変更する必要があ
る。」
URLパラメー

元記事を表示

OTHERカテゴリの最新記事