2012-02-03 5 views
0

私は、ユーザがmidiレコードのデータベースを検索し、与えられた属性に対応するMIDIファイルを見つけることができるように、レールアプリケーションを作成しています。 たとえば、ユーザーは、name = "blah" composer = "buh"およびdifficult = "insane"のmidiファイルのhtmlフォームにデータを入力することができます。 これはすべてうまくいきます。ただし、ユーザーがフィールドのデータを入力しない場合は、データベースでselectステートメントを実行するときにそのフィールドは無視されます。 は、今のところ、これは私のselect文は次のようになります。空の文字列パラメータが無視されるようにrailsデータベースクエリを設定する

@midis=Midi.where(:name => params[:midi][:name], 
        :style => params[:midi][:style], 
        :numparts => params[:midi][:numparts], 
        :composer=> params[:midi][:composer], 
        :difficulty => params[:midi[:difficulty]) 

予想通りこれは動作しますが、例えば、彼/彼女は:composer空白を離れた場合、作曲フィールドは全く考えられていないはずです。これはおそらく単純な構文ですが、私はそこにページを見つけることができませんでした。

ありがとうございました! ARELは、その直接サポートしている場合がありますが、いつものように何かができる

答えて

3

わからない:

conditions = { 
    :name => params[:midi][:name], 
    :style => params[:midi][:style], 
    :numparts => params[:midi][:numparts], 
    :composer=> params[:midi][:composer], 
    :difficulty => params[:midi[:difficulty] 
} 

@midis=Midi.where(conditions.select{|k,v| v.present?}) 
+0

感謝を!これは私の問題を解決する!私は最初にハッシュのドキュメントを見ていたはずです。 – BBB

1

これを試してみてください:

# Select the key/value pairs which are actually set and then convert the array back to Hash 
c = Hash[{ 
    :name  => params[:midi][:name], 
    :style  => params[:midi][:style], 
    :numparts => params[:midi][:numparts], 
    :composer => params[:midi][:composer], 
    :difficulty => params[:midi][:difficulty] 
    }.select{|k, v| v.present?}] 

Midi.where(c) 
+0

ありがとう!これも同様に動作します – BBB