加工したデータの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}) }
という風に作成しました。
他の人はどうやって処理を簡潔に書こうとしているのだろうか?
最近はとりあえず動かすってのを意識して、後から処理を変更するようにしています。