Webとデザインのあれこれ

プログラミングとUIデザインの学習記録です。

Railsの学習(DBとモデル編)

DBとモデルについて

DBとは

DBとは、追加や検索などが容易にできるよう整理されたデータの集まりのことを指します。DBは通常、複数のテーブルの集合で構成されています。

各テーブルの構成要素

下記のテーブルのように、2種類の要素で構成されています。

  • 1つのデータを表すレコード(1, りんご2502019/05/29)
  • データの内容を表すカラム(id商品名価格発売日)
     
テーブルの例
id 商品名 価格発売日
1 りんご 2502019/05/29
2 バナナ 1802019/05/28

DBには様々な種類が存在しますが、中でも複数の関係を基本的なデータ型とするリレーショナルデータベース(RDBMS)が普及しています。

Railsコンポーネントについて

モデルの話に入る前に、Railsの機能と構成について少し取り上げます。

Railsにおける基本のコンポーネント(Rubyで記述されたライブラリ)は、以下の3つです。

  1. Active Record
  2. Action View
  3. Action Controller

それぞれ、モデル、ビュー、コントローラに対応しており、覚えておくと良いですね!

また、その他にも、電子メール送信を扱うAction Mailerや画像のアップロード作業を扱うActive Storageなどが様々なパッケージが存在します。

モデルとは

  1. ActiveRecord
  2. ActionView
  3. ActionController

この3つのうち、Model(モデル)のgemパッケージに該当するのがActiveRecordです。ActiveRecordはDBとのやり取りを行うGemパッケージです。

MVCフレームワークにおけるModel(モデル)とは、DBとのやり取りを行うクラスのことを指します。

モデルクラスのインスタンスは、1つのレコードを表すオブジェクトとなります。

     
Fruit
id name pricedate
1 りんご 2502019/05/29
2 バナナ 1802019/05/28

例えば、上記のテーブルの場合を考えましょう。

fruit = Fruit.find(2) #2番目のレコードを取得
name = fruit.name
fruit.price = 300

まず、findメソッドにidの番号を渡すことによって、fruitテーブルの2番目のレコードを取り出しました。

その後は、変数名.カラムと同名のメソッドのように記述して各カラムの値を取り出して変数に格納しています。

このように、メソッドによる呼び出しがSQL文に自動で変換されてDBMSに送信されているため、RailsではSQL文を知らなくても容易に値を取得することが可能です。

レコードの検索メソッドについて

テーブルのレコードを検索する際に必要なメソッドについて確認しましょう。

  1. findメソッド
  2. find_byメソッド
  3. whereメソッド

findメソッド

user = User.find(2)

findメソッドにidの値を指定すると、その値を持つレコード(モデルオブジェクト)の取得が可能です。 DBの主キーはデフォルトがidですが、念の為クラスメソッドのidsを使って主キーのカラムを確認してから検索しましょう。

f:id:b_leiu:20190530234525p:plain

find_byメソッド

user = User.find_by(name: "Yoko")

findメソッドと異なり、特定のカラムを使ってレコードを検索するメソッドがfind_byです。

最初に条件に一致したもののみをデータとして返します。

findメソッドとfind_byメソッドはファインダーメソッドと呼ばれます。

whereメソッド

SQLのwhere句に該当するのがwhereメソッドです。こちらは、検索条件を細かく指定できるクエリーメソッドの一種です。

クエリーメソッドを使用してあげると検索条件を理解しやすいコードで記述できる他、複数のレコードを取得できます。

users = User.where("age < 50")

find_byメソッドと似ているようですが、クエリーメソッドはActiveRecord::Relationクラスの配列に似たオブジェクトを返します。 また、上記のように検索条件を文字列で指定することが可能です。

上記の場合、年齢が50歳未満の複数のデータが格納されたオブジェクトを返すため、テンプレート上で下記のような表示が可能です。

<% if @users %>
  <% @users.each do |user| %>
    <%= user.name %>
  <% end %>
<% end %>

クエリーメソッドの応用

SQL文を記載するように、クエリーメソッド同士の組み合わせやファインダーメソッドとの組み合わせも可能です。

# クエリーメソッド同士の組み合わせ
users = User.where(name: "Yoko").where("age < 50") 
members = Member.where(sex: 2).order("number")

# ファインダーメソッドとの組み合わせ
user = User.where(sex: 2). order(:age).first

結果をソートしたい場合、orderメソッドを使用するとnumberカラムの昇順で結果を取り出すことが可能です。

また、ファインダーメソッドfirstメソッドやlastメソッドと組み合わせると、最初に一致するレコードを1つ返します。

firstメソッドやlastメソッドを使用する場合は、結果が安定するように、orderメソッドでソート順にしてあげると良いです。

最後に

今回はデータの検索を中心に取り上げました。

参考文献: 改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)