QA@IT

ActiveRecordでもとのモデルのカラムにないデータを取得したい

3913 PV

Ruby on RailsのActiveRecordに関する質問です。

例えばGitのリポジトリブラウザを作っているとして、「リポジトリ一覧画面」ではコミットが新しい順にリポジトリを並べたいとします。

これは以下のように書けます:

@repositories = Repository.
  joins(:commits).
  group("repositories.id").
  order("MAX(commits.created_at) DESC")

(注:コミットが0個のリポジトリは存在しないものと仮定しています。)

ここで、「リポジトリ一覧画面」にはリポジトリ名だけでなく、その最終更新時刻も表示したくなったとします。
つまり、SQL中の「MAX(commits.created_at) 」を表示したいのですが、これをActiveRecord経由で取得することはできるでしょうか。

回答

http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

.select('*, MAX(commits.created_at) AS max_created_at') のようにするとよいと思います。

ただし、返ってくる情報は文字列になってしまいますので、要変換。

編集 履歴 (0)
  • あー、それでいけるんですね。inspectに出ないので駄目だと思い込んでしまいました。ありがとうございます。
    型はRDBMSによって違うようで、SQLiteでは文字列になりましたが、MySQLではTimeが取れました。
    -
  • ASを使わない場合は、['MAX(commits.created_at)']のようにselectに使った式そのものを[]に与えて参照することも出来ます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。