Life & Style

ruby-on-rails-find

データベースの操作には、言語としてSQL(構造化クエリ言語)を使用する。

しかしRuby on Railsには「ActiveRecord」があるおかげで、SQLを記述する必要はなくなり、Rubyを用いて直感的にデータベースを操作する事ができる。

SQLはデータベース製品固有の方言が存在するが、ActiveRecordはそれを内部的に吸収してくれる。

「ActiveRecord」 とは、Ruby on Railsを構成する重要なライブラリの1つで、Railsのモデル層に相当し、O/R(オブジェクト/リレーショナル)マッピングを担当する。

ORマッパーとは

O/R(オブジェクト/リレーショナル)マッパーとは、アプリケーションが持つオブジェクトをリレーショナルデータベース管理システム(RDBMS)のテーブルに接続すること。

アプリ側で使用するオブジェクトと、データベースが使用するリレーショナルデータベースモデルとは、構造が決定的に異なる。

そのため以前は、データベースから取得した表形式の結果を手動でオブジェクトのプロパティに割り当てたり、反対にデータベースに登録する値をオブジェクトから1つ1つ取り出すといった手順が必要であった。

O/Rマッパーはそのような開発生産性を低下させる構造的なギャップを解消してくれるのだ。

O/Rマッパーを用いると、SQL文を直接書く代りに、わずかなコードを書くだけで、オブジェクトの属性やリレーションシップをデータベースに保存したり、読み出すことができる。

とはいえども、裏ではSQLが発行されているため、正しいデータベース操作が行われているかどうかを確認できるスキルは必要だ。

そのためにも、リレーショナルデータベース管理システム(RDBMS)やSQLについての知識はあった方がベター。

ActiveRecordの記述方法

「ActiveRecord」の提供する機能は膨大であるため、今回は、「find」、「find_by」メソッドについて紹介する。

「find」、「find_by」は検索条件に該当するモデルのインスタンスを取得するメソッド。

インスタンスが返却されたるため、返却データから任意のカラムを取得する事ができる。

findメソッド

各モデルのidを検索キーとしてデータを取得するメソッド(id以外の条件で検索不可)。

該当データがない場合は例外(ActiveRecord::RecordNotFound)が発生する。

SampleModel.find(1)

SQLで同様の実装。

SELECT * FROM Inventory WHERE (SampleModel.id = 10) LIMIT 1

主キーの配列を渡し、マッチする複数のデータを取得する事も可能。

条件を配列で複数渡した場合、返り値もインスタンスではなく配列となる。

SampleModel.find([1, 10])

SQLで同様の実装。

SELECT * FROM SampleModel WHERE (SampleModel.id IN (1,10))

findメソッドに「!」を付けると!を付けると該当データがない場合にnilを返す事ができる。

SampleModel.find!(1)

find_byメソッド

複数の検索条件が指定可能で、条件に合うレコードの内、最初の1件のみを返す(1件しかヒットしないレコードに対してfind_byを使うことが多い)

該当データがない場合はnilが返ってくる。

findメソッドに!を付けると(find_by!)、該当データがない場合は例外を発生させる事ができる。

SampleModel.find_by(naem: “sample_name”)

SQLで同様の実装。

SELECT * FROM SampleModel WHERE (SampleModel.name = “sample_name”) LIMIT 1

複数の検索条件を指定する場合

SampleModel.find_by!(name: “sample_name”, adress: “sample_adress”)

SQLで同様の実装。

SELECT * FROM SampleModel WHERE (SampleModel.name = “sample_name” AND
SampleModel.adress = “sample_adress”) LIMIT 1

直感的にデータの取得が行える

「find」、「find_by」メソッドを使用してのデータ取得はSQLを書くよりも直感的で簡単である。

他にも「Active Record」は膨大なメソッドを持っているため、調べてみると面白い。

PICK UP

  • コメント ( 0 )

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。