Ruby on Rails 備忘録.2

「Ruby on Rails」を触っています。
今回もほとんどドットインストールkindleUnlimitedで学んだことの
備忘録みたいな感じです。

前回の 1 つのテーブルに対して CURD の処理を作りました。
その全編を記事を作りながら行っていたら大体 8 時間位かかりましたが、
振り返りながら 1 から作り直していったら 2 時間程度で行けたので、コツがつかめれば 1 時間は切れそうです。

目次

関連付けされた model を作成する。

1
2
3
4
# モデル作成
rails g model Comment [カラム名]:[カラム型] [カラム名(モデル名)]:references
# テーブルに展開
rails db:migrate

[カラム名(モデル名)]:refurencesの部分が外部制約されるカラムになる。

モデルの関連付けを設定する

[アプリケーションルート]\app\models[モデル名].rb を編集する。

モデルが 1 対 1 の関係を持っていることを示す場合、
参照モデル側では以下のように記述する。

1
2
3
class [被参照モデル] < ApplicationRecord
has_many:[参照モデル名]
end

被参照モデルには以下のように記載する。

1
2
3
class [参照モデル名] < ApplicationRecord
belongs_to :[被参照モデル名]
end

例に出される、投稿と投稿へのコメントのモデルの場合、
投稿に対してコメントには複数、コメントは投稿に対して一意に紐付く 1 対多の関係になっている。
has_onehas_many :througなどの関連付けもある。

複数モデルが関連づいたルーティング

1
2
3
4
5
Rails.application.routes.draw do
resources :[被参照モデルのコントローラ名] do
resources :[参照モデルのコントローラ名]
end
end

特定レコードへの参照モデルをビューで呼び出す。

被参照モデルを表示するとき
被参照モデルのコントローラ配下のようにする。

コントローラ
1
2
3
def メソッド
@data = [被参照モデル].find(params[:id])
end

インスタンス変数@data に被参照モデルの検索結果を持たせて、呼び出す

ビュー
1
2
3
4
5
6
7
8
# anyメソッドでデータが1つ以上あることを確認一覧出力
<% if @data.[参照モデルの複数形].any? %>
<ul>
<% @data.[参照モデルの複数形].each do|cell|%>
<p><%= cell.[カラム名] %></p>
<% end %>
</ul>
<% end %>

特定レコードへ関連付けされたデータ登録ビューの作成

被参照モデルのコントローラ配下のようにする。

コントローラ
1
2
3
def メソッド
@data = [被参照モデル].find(params[:id])
end
ビュー
1
2
3
4
<%= form_for([@data,@data.[参照モデルの複数形].build]) do |f|%>
<%= f.text_field :[参照モデルのカラム名] %>
<%= button_to 'SEND', [被参照モデル]_[参照モデルの複数形]_path(@data), method: :post %>
<% end %>

参照モデルがあるときの被参照モデルのレコード削除

削除処理をコントローラで定義するときは下の処理でよい

1
2
3
4
def destroy
@data = [被参照モデル].find(params[:id])
@data.destroy
end

が、参照モデルの定義をしているとエラーになる。
モデルの定義で、dependent:を指定することが必要
値は以下などの選択肢がある。

  • destroy
    指定したモデルの削除が実行される。
  • delete
    指定したモデルに対して直接 delete を行う。
  • nullify
    何もしない参照している外部キーには null を入れる
  • restrict_with_exception
    関連付けされたレコードがあるとき例外発生
  • restrict_with_error
    関連付けられたレコードがあるとき被参照レコードにエラーが追加される。

記述は下のようにする

1
2
3
class [参照モデル] < ApplicationRecord
has_many:[参照モデルの複数名],dependent: :destroy
end

それぞれの違いは、別途確認することにする。

今回までで、ある程度の操作がわかったので、
そろそろRuby on Rails Tutorialに手を出したい。
なんか調べたら、Ruby on Rails Tutorialの難易度が高めだとの書き込みを見つけ他ので、怖気づいて段階を踏みました。

ではでは。
Rails 面白い。