일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 一日一つメソッド
- 비즈니스일본어
- nico
- jsp
- 디지몬
- Spring
- html
- 일본어
- java
- Web
- DART
- javascript
- Flutter
- ruby
- 건담
- C로 시작하는 컴퓨터 프로그래밍4판
- rails7
- CSS
- springboot
- 자바
- 単語
- vscode
- 日本語
- メソッド
- 건담베이스
- 연습문제
- 반다이몰
- 인프런
- Python
- rails
- Today
- Total
AR삽질러
Rails 一日一つメソッド (Day3) all, find_dy, renderメソッド 본문
Rails 一日一つメソッド (Day3) all, find_dyメソッド, render
1. allメソッドとは
- allメソッドはActiveRecordモデルによって使用される。該当するTableのすべてのRecordを呼び出せる役割としてすべての列(Row)を検索し、各列に対するObjectの配列を返す。
allメソッドの使用方法 | ||
allメソッドの使用方法 | allメソッドを呼び出す。 | User.all : usersテーブルのすべてのRecordを返す。 |
チェーン | allで返された 'ActiveRecord::Relation' オブゼダートに追加のクエリメソッド をチェーンできる。 | User.all.order(:name) はすべての使用者を名前順番で整列 する。 |
クエリ組み合わせ | allメソッドをほかのメソッドを使ってもっと複雑なクエリを作る。 | User.all.where(active: true).limit(10) 活性化されたユーザの中で10個のRecordの返す。 |
結果処理 | allで持ってきたRecordに対して反復作業ができる。 | User.all.each { |user| puts user.name | すべてのユーザーの名前を出力する。 |
allメソッドの注意
- 大きいデータでは 'all' の代わりに 'find_each', 'find_in_batches' 'select' 'where を使う。
UsersController
class UsersController < ApplicationController
def index
@users = User.all
end
- 'index' アクションは、'User' Modelと関係するすべてのRecordをDabaBaseから持ってくる。
- 'User.all' はDabaBaseの 'users' テーブルに存在するすべてのユーザーを検索する。
- ActiveRecord:Relation : 'User.all' は 'ActiveRecord:Relation' オブゼダートを返す。これはDabaBaseクエリに接近する時に実行される。(Lazy Loading )
- インスタンス変数@users : '@users' インスタンス変数に検索されたすべてのユーザーが保存される。
routes.rb
Rails.application.routes.draw do
get 'users', to: 'users#index'
- URL経路 : usersを 'UsersController' の’index' アクションにMappingし、ユーザーがブラウザで 'http://usersに移動すると 'index'アクションが実行される。
index.rb
<h1>登録されている Users</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<% @users.each do |user| %>
<tr>
<td><%= user.id %></td>
<td><%= user.name %></td>
<td><%= user.email %></td>
</tr>
<% end %>
</tbody>
</table>
- UsersController 'index' アクションの設定された @usersインスタンス変数を使ってすべてのユーザーRecordを表す。
2. find_byメソッドとは
- ActiveRecordに使われ、特定の条件に一致するRecordを検索する。
- 特定の条件を満足する最初のRecordを探す時に使う
find_byメソッドの特徴 | ||
条件ベース検索 | 一つ以上の条件でRecordを検索する。 | User.find_by(id: 1) idが 1のUserオブジェクトを探す。 |
単一オブジェクトリターン | 条件を満足する最初のオブジェクトを返し、その条件がない場合は、nilを返す。 | |
クエリ最適化 | find_byは必要なDataだけ持ってくる。 |
find_byメソッドの注意
- 条件がない場合 'nil' を返すので、返されるオブジェクトが 'nil' かどうかを確認するロジックが実装する方がいい。
- find_byと似たように作動するfind_by!メソッドもある。 find_by!は条件に合うレコードがない場合、Active Record::Record Not Found例外を発生する。これは主に例外処理が必要な状況で使われる。
- find_byは条件に合う最初のレコードのみを返すので、 複数のレコードを返すには、whereメソッドを使う方がいい。
UsersController
class UsersController < ApplicationController
def user_search
if params[:name].blank?
flash.now[:alert] = '入力してください。'
render 'user_search'
else
@user = User.find_by(name: params[:name])
if @user.nil?
flash.now[:alert] = 'そのユーザーは存在しません。'
render 'user_search'
else
render 'user_show'
end
end
end
- user_searchアクションで params[:name]で入力されたユーザを探し一致するユーザーがない場合は、'nil' を返す。
- ユーザーがある場合は 'user_show' viewをレンダリングしない場はエラーメッセージとuser_search View をレンダリングする。
routes.rb
Rails.application.routes.draw do
get 'user_search', to: 'users#user_search', as: 'user_search'
end
- user_searchはUserControllerのuser_searchアクションにMappingされ検索機能を使う時に呼び出す。
user_search.html.erb
<!-- app/views/users/user_search.html.erb -->
<h1>User 検索</h1>
<%= form_with url: user_search_path, method: :get do |form| %>
<div>
<%= form.label :name, "User Name:" %>
<%= form.text_field :name, placeholder: "Enter User Name" %>
</div>
<br>
<div>
<%= form.submit "検索" %>
</div>
<% end %>
<% if flash[:alert] %>
<p><%= flash[:alert] %></p>
<% end %>
- ユーザーが入力したら 'user_search' アクションの 'params[:name]' を受けて入力された名前を伝わる。
show.hrml.erb
<!-- app/views/users/user_show.html.erb -->
<h1>User 情報</h1>
<p>
<strong>ID:</strong>
<%= @user.id %>
</p>
<p>
<strong>Name:</strong>
<%= @user.name %>
</p>
<p>
<strong>Email:</strong>
<%= @user.email %>
</p>
- 'user_search' アクションで探した '@user' オブジェクトの情報を表示する。
findメソッドとfind_byメソッドの違い
- findメソッドは 'ID'に基づいた検索に使われ、色んなRecordを返すことができる。その反面、'find_by'は与えられた条件によって一致する単一Recordだけを返す。
find Method
IDを基準に検索する。
単一IDを渡すと一致するIDを持っているすべてのRecordを返す。
find_by Method
与えられた条件(ID、名前、Email等々)を満足する最初のRecordを検索する。
条件に一致するRecordがいくつかあっても最初の一つだけを返す。
3. renderとは
- 'render'はControllerで使われViewテンプレートをRenderingしたり応答を直積生成する時に使われる。
class UsersController < ApplicationController
def user_search
if params[:name].blank?
flash.now[:alert] = '入力してください。'
render 'user_search'
else
@user = User.find_by(name: params[:name])
if @user.nil?
flash.now[:alert] = 'そのユーザーは存在しません。'
render 'user_search'
else
render 'user_show'
end
end
end
1. user_searchアクションでの 'render'
a) ユーザーがない場合
ユーザーが何も入力しなかった場合、'render user_search'を呼び出す。これは 'user_search.html.erb' ViewテンプレートをRenderingしユーザーに予め入力を要請したりエラーメッセージを表紙する。
b) 検索されたユーザーがいる場合
検索されたユーザーがいる場合は、render 'user_show' を呼び出し、user_show.html.erbビューテンプレートをレンダリングする。 これは、ユーザーが検索したユーザーの詳細を示している。
https://github.com/designAR/rails_method_study/tree/day03
'Ruby > RubyOnRails-日本語' 카테고리의 다른 글
Rails 一日一つメソッド (Day5) destroyメソッド (0) | 2023.12.25 |
---|---|
Rails 一日一つメソッド (Day4) createメソッド (0) | 2023.12.24 |
Rails 一日一つメソッド (Day2) findメソッド (2) | 2023.12.22 |
Rails 一日一つメソッド (Day01) 基本理念 (0) | 2023.12.21 |
Railsとは? (0) | 2023.12.13 |