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 Record
Action View
Action Controller
それぞれ、モデル、ビュー、コントローラに対応しており、覚えておくと良いですね!
また、その他にも、電子メール送信を扱うAction Mailer
や画像のアップロード作業を扱うActive Storage
などが様々なパッケージが存在します。
モデルとは
ActiveRecord
ActionView
ActionController
この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
メソッドでソート順にしてあげると良いです。
最後に
今回はデータの検索を中心に取り上げました。