モデルとメソッド

はじめに

railsのモデルとメソッドについて学習。その忘備録。

モデル(model) | Railsドキュメント

モデルの役割

モデルはApplicationRecordクラスを継承したクラスオブジェクトで、データベースを操作するためのメソッドを継承している(new, create, findなど)。

モデルは、それらのメソッドを利用して、自らと連携するデータベースのデータをもとにインスタンスを生成する。

一般的に様々な種類のデータリソースはそれぞれ別のテーブルで管理されるため、モデルもテーブルごとに必要になるのが自然。

モデルのメソッドの裏で何が起きているのか

データベースを処理するためのモデルのメソッドを呼び出すと、Active Recordによって、実際に利用しているデータベースのSQLに変換され、テーブルに対してSQLが実行される。

例) b = Book.find(2)とすると、Active RecordによってSELECT ...というSQLがbooksテーブルに発行され、その返り値がbに格納される。

モデルインスタンスのメソッド

モデルインスタンスは、テーブルの属性名と同名のメソッドを持ち、そのメソッドを使うことで値を取得できる。

例) Usersテーブルがid:2, name:fooの時、 user = User.find(2) user.id #2 user.name #foo

CRUD操作と標準装備のメソッド

CRUDは、 Create data Read data Update data Delete data の四つ。

前述したように、モデルはActive Recordを継承しているため、CRUD操作のためのメソッドを標準で装備している。

モデルクラス.操作メソッドまたは モデルインスタンス.操作メソッドとして、テーブルのデータのCRUD操作を行う。

Create

テーブルに新規保存する

save

インスタンスを保存する。引数は指定しない。 新規データの保存、または既存データの上書き保存に使う。 新規データを保存する際、既に存在しているid値をセットして保存しようとするとエラーになる。

例) user = User.new(name: '太郎') user.save #新しいidで保存される

user = User.new(name: '太郎', id:100) user.save #idが存在しなければid:100で保存される。既に存在している場合は例外エラー

create

newとsaveを同時に行う。 初期データを登録するときに便利。 ただし、通常の処理ではsaveを使用することが推奨されている。

例) User.create(name: '太郎', email: 'taro@aaa.com') #新しいidのデータとしてUsersテーブルに追加される

※newでidを指定しないでインスタンスを作成した段階では、idはnilになっている。saveすることによってidが決定される。

Read

テーブルからデータを取り出してインスタンスを作成する。

find(id値)

指定されたidを持つデータを取得し、対応するモデルのインスタンスを生成する。idを複数指定した場合は、インスタンスの配列を生成する。

例) Item.find(1) #

find_by(条件)

指定された条件(「属性:値」の組み合わせ)に一致するデータを取得し、対応するモデルのインスタンスを生成する。ただし、該当データが複数ある場合は、最初に一致するデータのみをインスタンス化する。つまり、取得するデータは常に一件。

※ find_byの条件にidを指定することもできるが、idがわかっている場合はfindを使った方が効率的。

もし、指定した条件に該当した全データを取得したい場合は、whereメソッドを使う。

all

テーブルの全データを取得し、インスタンス配列を生成する。

where

テーブルから指定された条件を満たす全データを取得し、インスタンス配列を生成する。 検索処理に使用する。

Update

テーブルのデータ内容を置き換える

update

モデルインスタンスだけでなく、モデルのクラスに対しても使える。 saveメソッドと異なり、引数に属性カラムとデータを指定する必要がある。

例) pd = Product.find(1) pd.update(price: 2500) #id:1のデータをprice:2500に更新(インスタンスメソッド)

Product.update(1, {price: 2500}) #id:1のデータをprice:2500に更新(クラスメソッド)

Delete

データを削除する

destroy

データをインスタンス化してから削除する。 updateと同様、インスタンスメソッドとクラスメソッドの両方と使用できる。

User.find(1).destroy #id:1のデータを削除(インスタンスメソッド) User.destroy(1) #id:1のデータを削除(クラスメソッド)

delete

データをインスタンス化せずに直接削除する。 コールバックが働かず、業務処理に適していない。

※ 削除メソッドによって削除されたidはまた利用できるわけでは無い。