複数選択可能なチェックボックスやリストボックスで選択された内容を一つのカラムに保存する方法
前提
どういう場面で使うか
入力画面で複数チェックボックスやリストボックスを表示するのは以下のようにかけます。(例としてリストボックス)
= m.select :answer, [['ア', 'ア'], ['イ', 'イ'], ['ウ', 'ウ'], ['エ', 'エ']], {}, { multiple: true, size: 4 }
このようにして作成したリストボックスで、以下のようにセットすると、controller には以下のように配列で返却されます。
# 'ア'と'ウ'を選択した場合 "answer" => [ [0] "", [1] "ア", [2] "ウ" ]
これには問題点があります。
- そのままではカラムに入らないこと
- 最初に空の値が存在すること
対処方法
そこで、以下のように array のメソッドである、 delete
を使って空の値を削除し、 join
を使ってカンマ区切りで結合します。
params[:questionnaire][:answer].delete('') params[:questionnaire][:answer] = params[:questionnaire][:answer].join(',')
上記を行うことで、返却値は
# 'ア'と'ウ'を選択した場合 "answer" => "ア,ウ"
となり、1カラムに格納することができるようになります。
データベースに格納した後に、その値を配列に戻して、画面に再表示しなければならないような場合はだんだんつらくなると思いますが、格納するだけでOKな場合はこのようなやり方はありだと思います。