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

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

【Rails】【Ruby】find_by_sql でも preload したいとき

# はじめに
`find_by_sql` を使って複雑なSQL文を書いたが、N+1を避けるために `preload`したい時がある。

# 結論
下記のように書けばOK
“`ruby
records = User.find_by_sql(…)
ActiveRecord::Associations::Preloader.new.preload(records, :like)
“`

下記は`preload`が無視されるのでダメ
“`ruby
User.preload(:like).find_by_sql(…)
“`

# 注意点
**Rails7 で記法が下記のように変わる**
“`ruby
records = User.find_by_sql(…)
ActiveRecord::Associations::Preloader.new(records: records, associations: :like).call
“`

# 参考
https://www.natsuneko.blog/entry/2017/04/18/find_by_sql-preload

元記事を表示

[Rails] 複数の小モデルを跨いだor検索

バージョンの問題で5.1.以下の複数の小モデルを使ったor検索の実装方法があまり載っていなく少しでも役に立つかもと思ったので投稿します。
もっと良い書き方があれば教えていただきたいです。

## 学んだこと
・includeを使うと小モデルのオブジェクトを親クラス内から使えるということを学びました。
“`
Child.include(:parent).is_summer_vacation
“`
・idを使ってor検索を実装すること(rails5.2からは.[or()](https://qiita.com/YumaInaura/items/c4ea8271f5793962a26d)を使っていけるかも)
## 環境
Rails 5.1.6.2
Ruby 2.5.0

### DB
“`book.rb
has_one: business #ビジネス書
has_one: novel #小説
has_one: comic #漫画
“`

### 複数の小モデルを跨いだor検索
本の検索サービスにおいてアメトークで紹介された本を絞り出すという状況を想定して実装コードを紹介します。
“`

元記事を表示

Rails 7 + ImportmapでFont Awesomeを実装する

# FontAwesome
アイコンを使うのに[FontAwesome](https://fontawesome.com/)というライブラリーはすごくいいだけど、インストールするには公式サイトにこれしか書いてなかったからインストールに詰まりました。
“`shell
# npm
npm install –save @fortawesome/fontawesome-free

# yarn
yarn add @fortawesome/fontawesome-free
“`

これだけだとアイコンは表示されないし、フレームワークごとのインストール方法は書いてなかったからちょっと調べてみたら、YouTubeの[この動画](https://www.youtube.com/watch?v=c-EbQDB0RsQ)を見つけてFontAwesomeをけっこう簡単に実装できたのでやり方をこちらにも書いときます。

そもそもImportmapの使い方は知らなかったのが詰まる原因だったと思うんで反省していますが、とにかく実装できたのですっきりしました。

# パッケージマネジャーでインストールした後に

元記事を表示

【Rails】countメソッドにカラムを指定してエラーを回避

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況

relationでjoinしている“`posts“`に“`count“`したら下記のエラーが発生し“`count“`できない。
“`ruby
posts = Post.joins(:users)
=>Post::ActiveRecord_Relation

posts.count
=>ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near “AS”
“`

## 解決法

ActiveRecordのcountメソッドは引数にカラムを指定できるのでそれを使うとcountできる。

“`ruby
posts = Post.joins(:users)
posts.count(:posts)
=> 4
“`

## 参考

https://railsdoc.com/page/count

元記事を表示

パーシャルとは?

# パーシャルとは?
“`レンダリング処理を扱いやすい単位に分割“`するしくみです。

## パーシャルの表記方法
パーシャルを“`ビューの一部としてレンダリング“`するには、ビュー内で以下のようにrender メソッドを使います。
“`html
<%= render "menu" %>
“`
## パーシャルのファイルの名前の注意点
レンダリングされるビュー内に置かれている上のコードは、その場所で_menu.html.erbという名前のファイルをレンダリングします。“`パーシャルファイル名の冒頭にはアンダースコアが付いている“`ことにご注意ください。

### _(アンダースコア)をつけない場合もある
アンダースコアは通常のビューと区別するために付けられていますが、アンダースコアなしで参照されることもあります。“`これは他のフォルダの下にあるパーシャルを取り込む場合“`も同様です。

“`html
<%= render "shared/menu" %>
“`
上のコードは、app/views/shared/_menu.html.erbパーシャルをその位置に取り

元記事を表示

flashに任意のキーをセットして表示するには

## 環境
Rails 5.2
Ubuntu20.4

## はじめに
flashにはオプションとして、**notice**と**alert**の2つのキーが用意されていますが、任意でnoticeとalert以外のキーを設定して、取り出して表示することもできるようになっています。

## 普通のやり方
標準的な使い方をする場合は、noticeとalertだけを使います。コントローラーでflashにメッセージを設定します。
“`test_controller.rb
flash[:alert] = “アラートです。”
flash[:notice] = “注意事項です”
redirect_to test_url
“`

flashの変数の中身を見ると、alertとnoticeに値が正しくセットされていることが確認できます。
“`
#, @flashes={“alert”=>”アラートです。”, “notice”=>”注意事項です”}, @now

元記事を表示

Rails7でflash.nowを表示させる

### 解決したい事

私が出した質問なのですが、まずはご覧になってください。

https://qiita.com/woodman0224/questions/0eb98675a161c2dce0a5

記事の通りではありますがrenderはされてもflash.nowが表示されなくて困っていました。

### 解決策
たくさんの記事をよく読んでいると、もしかしてと思う事があったので試してみたらできました。

それはフォームでTurbo Drive を無効にするという方法です。
“` ruby
#sessions/new.html.erb

#改善前
<%= form_with(url: login_path, scope: :session, local: true) do |f| %>

#改善後
<%= form_with(url: login_path, scope: :session, local: true, data: { turbo: false }) do |f| %>

“`

やはり予想が正しくrailsのバージョン

元記事を表示

[Rails]特定のカラムの値を取得(pluck)

# Pluckメソッド
指定したカラムの値を配列で返してくれます。
“`ruby
モデル名.pluck(取得したいカラム名)
“`

【例】usersテーブル
| id | name | bounty |
| — | ——- | ——— |
| 1 | ルフィ | 30億 |
| 2 | バギー | 31億8900万 |
| 3 | ティーチ | 39億9600万 |
| 4 | シャンクス | 40億4890万 |

上記のような`users`テーブルから`name`カラムの値だけ取得したい場合、`pluck`メソッドを用いると便利です。`User`モデルを指定し、引数にカラム名`name`を渡します。

“`ruby
User.pluck(:name)

=> [“ルフィ”, “バギー”, “ティーチ”, “シャンクス”] # 返り値
“`
また、引数に複数のカラムを指定することもできます。
“`ruby
User.pluck(:name, :bounty)
=> [[“ルフィ”,”30億”], [“バギー

元記事を表示

Rails7.0.4 Ruby3.1 Mysql8.0 docker-compose で環境構築する。ついでにTailwindCSS と DaisyUI も入れちゃう。

# はじめに
勉強用にちいさなアプリを作成することがありますが、環境構築がめんどくさくて止めちゃうことありますよね?
環境構築で詰まらないように記録しておきます。

Rails の環境構築の記事はたくさんありますが、できるだけ最新のバージョンでやってみました。
Rails 7.0.4
Ruby 3.1
Mysql 8.0
# 参考

https://docs.docker.com/samples/rails/

https://qiita.com/croquette0212/items/7b99d9339fd773ddf20b

# プロジェクトの作成

“`sh
mkdir test-app
cd test-app
“`

# 設定ファイルの作成

“`Dockerfile:Dockerfile
FROM ruby:3.1

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /mya

元記事を表示

SQLite3::SQLException: table “users” already exists というエラーが出た時の解決方法

# 結論: Usersテーブル削除する

ターミナルで
“`terminal
$ rails db

.tables   ###テーブルの一覧表示

drop table users ### usersテーブル削除

ctrl + d で抜けられる
““
以上

元記事を表示

has_manyのsourceオプションはいつ使うのか

has_manyメソッドのsourceオプションは次の場合に使用します。

1. 多対多のアソシエーションに別名をつける
2. has_manyで指定するモデル名が重複している

例として、ユーザーが投稿を作成・いいねできる関連付けを行います。
![qiita-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881292/053db736-90b1-83ee-8377-7dc51705ef82.png)

#### いいねした投稿を取得する
“`ruby
#models/user.rb
class User < ApplicationRecord has_many :posts has_many :likes end #models/like.rb class Like < ApplicationRecord belongs_to :user belongs_to :post end #models/post.rb class Post < ApplicationRec

元記事を表示

コード譜投稿アプリを作る#6 (railsのプライマリキーをuuidに変更)

[← 前回の記事](https://qiita.com/t_sekky/items/2fe386ba8b74e89b06b3)

# 今回やること
これまでプライマリキーは特にいじらなかったので、idは整数型のオートインクリメント(1, 2, 3 …)になっています。
これから作る予定のサイトはユーザー投稿型のサイトにしたいので、idをuuidにして`/scores/1`のようなURLではなく`/scores/7a670050-7d74-473c-b322-0322b622b232`のようなURLでコード譜それぞれにアクセスできるようにします。

こうすることによるメリットは、
– URLが推定できてしまうのを防ぐ
– 全体のレコード数が把握できてしまうのを防ぐ

などがあると思います。
特にサービス立ち上げ当初は「ひとけ」がないのがバレやすいのもあるかなと。

トランザクションがめちゃくちゃ増えそうなサービス内容でもないですし、PostgreSQLであればuuidを採用してもパフォーマンスがめちゃくちゃ落ちるということもなさそうなので、今回は全面的にuuidを採用します。(mys

元記事を表示

Rspecの処理を共通化させる

– specフォルダ直下にsupportフォルダを作る
– 共通化したい処理を書いたモジュールを追記

“`ruby:json_api_helper
module JsonApiHelpers
def json
JSON.parse(response.body)
end
def json_data
json[“data”]
end
end
“`
– “`rails_helper.rb“`の23行目をコメントアウトする。これをコメントアウトすると、“`spec/support“`に入っているファイルをループで全て“`require“`する。

“`ruby:rails_helper.rb
Dir[Rails.root.join(‘spec’, ‘support’, ‘**’, ‘*.rb’)].sort.each { |f| require f }
“`
– “`rails_helper.rb“`の下記のブロックに“`include“`したいファイルを追記。**spec_helper.rbの似たブロックと間違わないように!!!*

元記事を表示

コントローラの内容をレンダリングする

# railsチュートリアルの説明の大まかな流れ
まずユーザーに送信すべきレスポンスの内容を決定し、次にユーザーへの“`レスポンスを作成する適切なメソッドを呼び出します。“` レスポンス画面を完全なビューで作成すると、Railsはそのビューを“`レイアウトでラップ“`して、場合によっては“`パーシャルビュー“`もそこに追加します。本ガイドではこれらの方法をひととおり紹介します。

### 気づき
レイアウトでラップするという意味がわからない。
包むというらしい。

CSS 最近のWebページやアプリのレイアウトに適した、ラッパーの実装テクニックを徹底解説

# コントローラ名のビューを探してレンダリングする。
「コントローラのアクションの末尾で明示的に“`レンダリングが指示されていない場合は、コントローラが利用可能なビューのパスからアクション名.html.erbというビューテンプレートを探し、それを使って自動的にレンダリング“`する」

# renderメソッド
ほとんどの場合

元記事を表示

Ruby On Rails で 主キーに UUID を使用する

# Ruby On Rails とは?
– Ruby On Rails (以下、Rails)については[こちら](https://ja.wikipedia.org/wiki/Ruby_on_Rails)をご確認下さい。

# UUID とは何か?
– UUID とは **Universally Unique IDentifier** のことで普遍的な一意の識別子のことを指す。

# なぜ Rails で主キーに UUID を使用するのか? 
– 例えば MySQL であれば主キーに **AUTO_INCREMENT** を使用するケースが多いと思いますが、そうすると該当ページへアクセスする場合、 Rails では URL が `https://example.com/users/1` というようになってしまい、 **1** の部分が **2** だったらどうなのか、 **10**、**100** だったらどうなのか・・・というような感じで簡単に推測されてしまいます。
– [cancancan](https://github.com/CanCanCommunity/cancancan)

元記事を表示

Docker+Rails6+Nginx +MySQLで環境構築~M1Mac対応

## 概要
みなさん、こんにちは、shunです。今回はRails、MySQL、Nginxのコンテナ環境を構築していきたいと思います

## 前提
– フレームワークはRails
– Rubyのバージョンは2.7.3
– Railsのバージョンは6.1.3
– DBはMySQL
– アプリケーションサーバはPuma
– WebサーバはNginx
– DB側のコンテナ名はmysql、Rails側のコンテナ名はapp、Nginx側はwebにします
– 開発用はdocker-compose.yml(Rails+MySQL)として作成します
– 本番用はdocker-compose.prod.yml(Rails+MySQL+Nginx)として作成します

## はじめに
プロジェクトを作成するディレクトリを作成します
初回作成時のディレクトリ構成は以下の通りです
containersフォルダを作成し、その中にRails、MySQL、Nginxのフォルダを作成してください
また、Nginxのフォルダの中にconf.dフォルダも作成します
“`
❯ tree
.
├── Gemfile
├── G

元記事を表示

🔰【rails】テーブルから「レコード取得」➡「レコードの値を」に役立つメソッド

>どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼

今日はrailsでよく使うメソッド達を順序立てて皆さんにいくつか紹介したいと思います。😆
(すぐに結論を見たい人は`2.先に結論`の関係図をみて頂ければ幸いです。)

プログラムは大まかには以下3つのフェーズに大別することができます。

1. データベースから特定レコードを取得する。
2. 取得したものを使いやすいように加工する。
3. view(ブラウザ)で表示させる。

今回の記事では`1.` 、`2.`の部分でよく使われる便利メソッドを紹介したいと思いますので、
よろしくお願い致します。😄

# 1. はじめに
本記事は以下の読者が対象です。

– プログラミング初学者
– rails を使い始めたばかりの人
– eachメソッドを使ったことがある人

# 2. 先に結論
– 取得用の便利メソッド
– find
– find_by
– where
– 加工用の便利メソッド

元記事を表示

コード譜投稿アプリを作る #4(apollo clientを使ってnextからrailsにリクエストする)

[←前回の記事](https://qiita.com/t_sekky/items/70fca252f9fbe4b42d79)

# 今回やること
前回railsとGraphQLを使ってバックエンドの実装を進めたので今回はそれをフロントで表示するのが目標です。
apollo使います
何かっていうとフロントでgraphqlを使うためのライブラリです。

## apollo clientインストール
フロント側で以下を実行
“`
yarn add @apollo/client graphql
“`

## apolloセットアップ
`/src/pages/_App.tsx`に以下を追記

“` tsx:/src/pages/_App.tsx
import type { ReactElement, ReactNode } from ‘react’
import type { NextPage } from ‘next’
import type { AppProps } from ‘next/app’
import { ChakraProvider } from ‘@chakra-ui/r

元記事を表示

コード譜投稿アプリを作る #3(railsにgraphql導入)

[←前回の記事](https://qiita.com/t_sekky/items/336c1fa8dd7a0f3d8f1b)

# GraphQLの導入経緯
当初は導入するつもりはなかったのですが、新しくジョインするところがRails&GraphQLでバックエンドを実装しているらしいので練習がてら急遽導入することに決めました。
これまではshopifyのカートシステムのgraphQLAPIを使ってフロントを実装する、ということはやっていたので呼び出し側ではgraphQL使ったことがありますが、APIを作成したことはなかったので慣れておかないと…

GraphQLがどんなものかとか、REST APIとどう違うかなどは他に良い記事がいくつもあるので省略。

# GraphQLのインストール
GraphQL公式の[Rails用チュートリアル](https://graphql-ruby.org/getting_started)をみながら進めていきます。

まずはgemをダウンロード

Gemfileに追加して、
“`:Gemfile
gem “graphql”
“`
コマンド実行
“`

元記事を表示

Ruby on Railsでrails sが起動しない rails aborted! TZInfo::DataSourceNotFound

# 内容
[Progateのサイト](https://prog-8.com/docs/rails-env-win)の通りに環境構築をしていた時に出たエラー
rails sが通らない/サーバーが起動しない

# 構成
Windows 11 Pro 21H2
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x64-mingw-ucrt]
Rails 7.0.4

# エラー内容
rails aborted!
TZInfo::DataSourceNotFound: tzinfo-data is not present. Please add gem ‘tzinfo-data’ to your Gemfile and run bundle install

# 改善方法 2工程
1, プロジェクト内のGemfileの40行目を変更する
gem “tzinfo-data”以降をコメントアウト
“`diff:
– gem “tzinfo-data”, platforms: %i[ mingw mswin x64_mingw jruby ]
+ ge

元記事を表示

OTHERカテゴリの最新記事