Rails の f.collection_select で複数カラムを結合した文字列で表示する

Rails でテーブルからセレクトボックスを生成するときに collection_select を使うけど,特定のカラムではなくて,複数のカラムを文字列連結して表示したいというシチュエーションがあったので,試してみた.

基本形 (.haml)

users テーブルに idname カラムがあるという前提で,name をセレクトボックスとして表示するパターン.

%td
  = f.collection_select :user_id, @users, :id, :name

モデルにメソッドを実装して呼び出す (.haml)

内容は仮として,user.rbview_name_and_id を実装して,そこに表示する文字列を返すようにする.

class User < ActiveRecord::Base
  def view_name_and_id
    self.name + '(' + self.id.to_s + ')'
  end
end

haml 側で,そのメソッドを呼び出せば良い.

%td
  = f.collection_select :user_id, @users, :id, :view_name_and_id

デコレータに移して呼び出す (.haml)

あとはまぁ好みの問題かもしれないけど,デコレータに移すのもあり. haml 側は変えずそのままで大丈夫.

module UserDecorator
  def view_name_and_id
    self.name + ' (' + self.id + ')'
  end
end

関連エントリー

collection_select - リファレンス - Railsドキュメント
collection_selectに複数カラムのテキスト情報を表示 | Scimpr Blog
プルダウンメニュー(select_tag)の中身をデータベースに用意する - Rails つまみぐい