joins句で取得するデータは配列になっている

当たり前のことですが、かなりはまったのでメモしておきます。

下記のようなuser_infoオブジェクトにデータベースからデータを取得したいとします。その際に、属性のような情報を別テーブルから結合して取得します。そのために、joins句を使用してテーブルを内部結合しています。その結果取得できるデータ件数が、1レコードだけと想定しています。

[sourcecode language="ruby"] condition = "user_infos.del_flg = 0 …"

ここは配列になる

user_info_data = UserInfo.joins('INNER JOIN … .limit(1)

取得されるオブジェクトは1レコードのみ

@user_info = user_info_data[0] [/sourcecode]

scaffoldingなどで作成した参照画面では、単一のオブジェクトのデータを表示するようになっています。つまり、find_by_…メソッドの戻り値のように配列でないオブジェクトである必要があります。

ところが、テーブルをjoins句で結合した場合、取得されるオブジェクトは配列となります。そのため、各オブジェクトのプロパティへアクセスできない現象が発生するのです。(このときは、user_info には…なんて存在しないよと怒られるのです。)

うーん、Rubyでは自分が想定しているデータ型と異なるデータ型以外にも、配列かそうでないかなど様々な観点で扱うオブジェクトを想定する必要がありますね。こういう小さな失敗を経験して成長する…はず(ーー;)