加工したデータのf.selectの作成方法

f.collection_selectを使いたいけど、なんか違う・・・

少し加工したデータをセレクトで表示したいという時の方法です。

状況

選手名(Playerモデル)のデータを表示しようとしています。

  • first_name, last_nameとカラムが分かれている
  • full_nameというメソッド(first_name, last_nameをつなげる)があるので、姓名をまとめて表示したい

こういう状況が発生しました。

やり方

controller

before_action :set_players

def set_players
  @players = Player.all.map { |x| %W(#{x.full_name} #{x.id}) }←ここで必要な情報を作成する
end

view

= f.select :player_id, @players

最終的な結果を得るための方法(雑談)

最近は行数を減らすのにはまっています。

どういう風に他の人が考えているのかわからないですが、自分のやり方です。

まずは、動いている結果を見ます。

=> [["ダルビッシュ有", "1"], ["田中将大", "2"]]

上記のようになっていたので、上記のように加工したかったのです。

動く形を作成。

Player.all.map do |player|
  x = []
  x << player.full_name
  x << player.id
  x
end

無駄に行数が多いので、なんとか削除したい・・・

x <<の部分は配列で処理できるんじゃないのか?

Player.all.map do |player|
  x = []
  x = %W(#{x.full_name} #{x.id})
end

%Wが配列を作成してくれるので、初期値いらなくない?

なら、{}で一行で書けるな。

Player.all.map { |x| %W(#{x.full_name} #{x.id}) }

という風に作成しました。

他の人はどうやって処理を簡潔に書こうとしているのだろうか?

最近はとりあえず動かすってのを意識して、後から処理を変更するようにしています。