3

複雑な動的SQLクエリを作成する必要をなくすために、条件にnil値を渡すだけで、それらを無視できるようにしたいと思います。それはActiveRecordでサポートされていますか?

これが例です。

event = Event.find(:all, :conditions => { 
                                          :title       => params[:title],
                                          :start_time  => params[:start_time], 
                                          :end_time    => params[:end_time]
                                        }).first

その特定のケースでは、params [:start_time]がnilに設定されている場合、ActiveRecordはstart_timeがnullに設定されているイベントを検索します。代わりに、start_timeを無視してください。それ、どうやったら出来るの?

4

1 に答える 1

6

必要なことを行うために「複雑な動的SQLクエリを作成する」必要はありません。条件ハッシュを個別に作成し、作成時またはハッシュの作成後にnull値を除外するだけです。

conditions = {}
conditions[:title] = params[:title] unless params[:title].blank?
conditions[:start_time] = params[:start_time] unless params[:start_time].blank?
conditions[:end_time] = params[:end_time] unless params[:end_time].blank?

また

conditions = {:title => params[:title], :start_time => params[:start_time], :end_time => params[:end_time]}
conditions.delete_if {|k,v| v.blank? }

また

conditions = params.reject {|k,v| !([:title, :start_time, :end_time]).include?(k) }

ただし、最後の形式は、キーが実際に記号である場合にのみ機能します。Railsでは、paramsハッシュはHashWithIndifferentAccessであり、テキストキーにシンボルとしてアクセスできます。もちろん、必要に応じて、キーの配列のテキスト値を使用して含めることもできます。

次に、事前に作成された条件ハッシュを使用してクエリを実行します。

event = Event.find(:all, :conditions => conditions).first
于 2012-04-19T16:21:19.963 に答える