りゅうじのRails学習のアウトプットblog

初学者による初学者の為の記事です。

2021年9月2日 パーフェクト Ruby on Rails

第2章 Ruby on RailsMVC

2-1 MVCアーキテクチャ

  • M(Model)
    • データベースとの接続
  • V(View)
    • 視覚表現を行う部分
  • C(Controller)
    • ModelとViewをつなぐ部分

2-1-2

モデルの役割 - データベースと接続し、データベースのレコードをActive Recordオブジェクトを結びつける役割(Active Record) - バリデーションや、レコード保存時などに実行する様々なコールバックなどを実行する役割。(Active Modelが担っている)

Active Record RailsにはModelにActiveRecordが適用されているおかげで、Rubyを用いてDBからデータを探したり、持ってきたりすることができます。 - Active Recordがあるおかげでcreatenew,find,all…などのメソッドが使うことができます。 生のSQLを書かなくていい様にしてくれています。

Active Model Active Recordの多くのモジュール含むライブラリです。

Actioin Pack MVC のうち View と Controller を司るのが ActionPackというライブラリです。

MVCのモデルとは

あるシステムを作るという事は、そのシステムが解決する問題に対して必要な概念を探して、名前を付けたり相互の関係性を整理したりする事であり、その行為をモデリングと呼び、これがMVCのモデルです。

CRUD

データベースのレコードに対する基本的な操作のことです。 Create、Read、Update、Delete

※ Readはデータに影響を与えないので参照系、それ以外はデータに影響を与えるので更新系です。


2-2 モデルを扱う

モデルを通じて検索を行う = Railsの書き方でSQL検索

2-2-1

  • データベースに登録されているレコードを一件だけ検索
    • findメソッド : idを使用してレコードを取得
      • 検索結果が見つからないとActiverecord::RecordNotFound例外が発生
    • find_byメソッド : id以外を使ってレコードを取得
      • 検索結果が見つからないとnilを返す
  • 複数件のレコードを検索する場合
    • whereメソッド

ActiveRecord::Relation

  • SQLのそれぞれの表現に対応したメソッドをチェーンみたいに繋げていくことが可能です。(例:Book.where("price>?", 3000).limit(3).order(:name)みたいな感じ)
  • 実行結果のデータを普通の配列と同じような感覚で扱えます。

メソッドチェインを使うメリット

必要以上にデータベースとの通信が発生してしまうのを防ぐ効果があります。また、処理の流れを明確にできることがあります。 非同期処理を挟まない限り、前から後ろに向けて順番に処理されます。処理がメソッドチェインの各スコープの中で完結するため、一時変数を定義したり命名する手間が省けます。

Query Interface

Active Recordのメソッド(select、where、limitなど)のこと。

クエリ

「問い合わせ」。データベースに対する命令文のことです。
SQLは「言語」でクエリ(SQL文)は「命令(文)」です。

scopeの定義

よく利用する検索条件に名前をつけてひとまとめにしたもの (例:名前を"物件の条件"とした場合、内容を"バス・トイレ別, 室内洗濯機置き場"などにし、その後"物件の条件"という名前で呼び出せば、毎回内容を記載する必要がないため使い回しに便利です。)

scope :高級物件, -> { where("家賃 > ?", 100,000円)}
scope :トイレ, -> (toilet){ find_by(toilet: toilet) }

トイレのscopeを例にするとトイレがない場合はActiveRecord::Relationが返る。。

scopeで定義した場合は結果がnilでもActiveRecord::Relationを返します。もしnilを返したい場合はクラスメソッドとして定義したほうが良いです。

クラスメソッド

モデルで定義するメソッドのことです。

User.hoge # クラス名.クラスの中にあるメソッド名 で呼び出す


class Home
    def self.toilet(toilet)
        Home.find_by("あるよ")
        puts "トイレつきだあ"
    end
end


Home.toilet("あるよ")
=> トイレつきだあ
Home.toilet("ないよ")
=> nil

参照

Active Record https://qiita.com/ryokky59/items/a1d0b4e86bacbd7ef6e8

Action Pack https://magazine.rubyist.net/articles/0008/0008-RubyOnRails.html

クエリとは https://wa3.i-3-i.info/word11290.html

scopeとクエリについて https://qiita.com/ozin/items/24d1b220a002004a6351

クラスメソッドとは https://qiita.com/right1121/items/c74d350bab32113d4f3d