2016-05-31 10 views
1

基本的には、自分のフォームにチェックボックスを受け入れるオプションを作成したいと思います(0からすべての値が受け入れられます)。SimpleFormを使用して複数のチェックボックスの値を正しく保存するにはどうすればよいですか?

私は列挙型の構造が大好きです。なぜなら、DBに整数を格納するパフォーマンスの速度が得られるからですが、私のコードでそのシンボルを参照することができます。しかし、私はチェックボックスのような複数の値を格納しているときに列挙型を使うことはできません。

私はそれが最良のものであると想像する方法は、配列でもある文字列として保存することです。したがって、このような何か:

# refactor_rule   :string   default([]), is an Array 

それから私のフォームは、次のようになります。

<%= f.input :refactor_rule, collection: ["dry", "concise", "performant"], as: :check_boxes, class: "form-control" %> 

問題このアプローチで、私は(つまり、すべてではない)だけ1またはオプションの2保存するとき、これがあるさ私は理由[0]で空の値で、嫌い

q.refactor_rule 
=> ["", "dry", "concise"] 

:属性がどのように見えますか。

次のようにだから私の質問は以下のとおりです。

  1. これを達成するための最もパフォーマンスの方法は何?私のチェックボックスのオプションは静的ですが、フィールドは複数ではない1を受け入れる必要があることに注意してください。
  2. チェックされた値と空ではない値のみを保存するにはどうすればよいですか?
  3. 複数の値を格納していてもRails組み込みのenum機能を利用する方法はありますか?

答えて

1

あなたはいつもあなたの属性を「きれい」にこのようなものを持つことができますつもりあなたの配列から空の要素をすべて拒否され

q.refactor_rule.reject!(&:empty?) 

を。 !を気にしてください。 reject!はそれを空要素なしで置き換え、rejectはそれを返します。あなたの電話!代わりに列挙型の

create_table :products do |t| 
    t.text :tags, array: true, default: [] 
end 

(これはthis blog postからPlataformatecからである)

+0

DB内に 'array'を使用しない場合、どうすれば保存できますか?文字列?私はすでにdbの配列として設定しています。 – marcamillion

+0

これを文字列として保存する必要はありません。これは、これを読み書きするたびにデコードする必要があるためです。それが意味をなさけるなら、 'has_many:refactor_rules'という関係を持つ別のモデル(" RefactorRule "と呼ばれるかもしれません)を作ってください。この方法で、あなたは協会の力を利用し、Railsを最高速度で使用することができます:) – Stan

2

(:

あなたが本当にデータベースに配列を格納する必要がある場合、あなたはあなたの移行で、そのようにそれを行うことができます1つの値だけを格納することができます)またはシリアライズされた配列(遅い記憶領域が必要です)を使用する場合は、ブール値をビットフィールドとして格納することを検討してください。このアプローチでは、複数のブール値(フラグ)を、各フラグが整数内の独自のビット位置を持つ単一の整数列に変換します。これはもちろん、パフォーマンスに大きなプラスの影響を与えます。テキスト列の部分文字列を検索するのではなく、& operator(MySQLの場合)を使用してフラグの任意の組み合わせを検索できます。

flag_shih_tzuまたはbitfields宝石を見てみましょう。両方の宝石はActive Recordを強化して、すべてのフラグがモデルオブジェクトの別々の「仮想」属性のように機能し、これらの属性を使って検索する便利な方法を提供します。これがうまくいくには、simple_formフォームを書き直して、1つではなく3つのチェックボックスを使用する必要があるでしょう。

+0

興味深い...このオプションをくれてくれてありがとう。私はおそらくこのルートに行くことはありませんが、探検するのは面白いです。 – marcamillion

関連する問題