Railsの学習(DBとモデル編)
DBとモデルについて
DBとは
DBとは、追加や検索などが容易にできるよう整理されたデータの集まりのことを指します。DBは通常、複数のテーブルの集合で構成されています。
各テーブルの構成要素
下記のテーブルのように、2種類の要素で構成されています。
- 1つのデータを表すレコード(
1,りんご、250、2019/05/29) - データの内容を表すカラム(
id、商品名、価格、発売日)
| id | 商品名 | 価格 | 発売日 |
|---|---|---|---|
| 1 | りんご | 250 | 2019/05/29 |
| 2 | バナナ | 180 | 2019/05/28 |
DBには様々な種類が存在しますが、中でも複数の関係を基本的なデータ型とするリレーショナルデータベース(RDBMS)が普及しています。
Railsのコンポーネントについて
モデルの話に入る前に、Railsの機能と構成について少し取り上げます。
Railsにおける基本のコンポーネント(Rubyで記述されたライブラリ)は、以下の3つです。
Active RecordAction ViewAction Controller
それぞれ、モデル、ビュー、コントローラに対応しており、覚えておくと良いですね!
また、その他にも、電子メール送信を扱うAction Mailerや画像のアップロード作業を扱うActive Storageなどが様々なパッケージが存在します。
モデルとは
ActiveRecordActionViewActionController
この3つのうち、Model(モデル)のgemパッケージに該当するのがActiveRecordです。ActiveRecordはDBとのやり取りを行うGemパッケージです。
MVCフレームワークにおけるModel(モデル)とは、DBとのやり取りを行うクラスのことを指します。
モデルクラスのインスタンスは、1つのレコードを表すオブジェクトとなります。
| id | name | price | date |
|---|---|---|---|
| 1 | りんご | 250 | 2019/05/29 |
| 2 | バナナ | 180 | 2019/05/28 |
例えば、上記のテーブルの場合を考えましょう。
fruit = Fruit.find(2) #2番目のレコードを取得 name = fruit.name fruit.price = 300
まず、findメソッドにidの番号を渡すことによって、fruitテーブルの2番目のレコードを取り出しました。
その後は、変数名.カラムと同名のメソッドのように記述して各カラムの値を取り出して変数に格納しています。
このように、メソッドによる呼び出しがSQL文に自動で変換されてDBMSに送信されているため、RailsではSQL文を知らなくても容易に値を取得することが可能です。
レコードの検索メソッドについて
テーブルのレコードを検索する際に必要なメソッドについて確認しましょう。
- findメソッド
- find_byメソッド
- whereメソッド
findメソッド
user = User.find(2)
findメソッドにidの値を指定すると、その値を持つレコード(モデルオブジェクト)の取得が可能です。
DBの主キーはデフォルトがidですが、念の為クラスメソッドのidsを使って主キーのカラムを確認してから検索しましょう。

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メソッドでソート順にしてあげると良いです。
最後に
今回はデータの検索を中心に取り上げました。