findメソッドとwhereメソッド

Ruby on Rails でscaffoldingを使用すると、様々なデータ取得メソッドが生成される。具体的には "find"メソッドのように主キーで一意なデータを取得したりするようなメソッドが生成される。

ただ、主キーとそれ以外の列を用いてデータを取得したい場合、具体的には論理削除フラグなどのフラグを参照する場合だけれども、この"find"メソッドは使用できない。

そんなときに使用するのが"where"メソッド。こちらは、SQLの条件句をプレースフォルダを用いて作成できるのでとても便利。

ただ、気をつけないといけないことがあって、"find"メソッドをそのまま"where"メソッドへ置き換えるとviewで「メソッドが見つからない」というエラーが発生するようになります。今日はこれでかなりはまった…。

原因は"find"メソッドの戻り値は、取得したクラスのインスタンスが返ってくるのですが、"where"メソッドの戻り値は取得したクラスのインスタンスを持った配列が返ってくるためです。(当たり前と言えば当たり前…。主キーを指定して検索しているわけではないので、戻り値の個数は特定できないため配列になる)

ということで、"where"メソッドに続いて"first"メソッドを指定することで"find"メソッドと同一の処理結果となりめでたしめでたしとなります。