如何获取ActiveRecord查询以忽略nil条件?

时间:2012-04-19 16:09:16

标签: ruby-on-rails-3 activerecord

为了避免构建复杂的动态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。我该怎么做?

1 个答案:

答案 0 :(得分:6)

您无需“创建复杂的动态SQL查询”即可完成所需操作。只需单独构造条件哈希,并在创建时或创建哈希后排除空值。

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,它允许您将文本键作为符号进行访问。当然,如果需要,您可以只使用键数组中的文本值。

然后使用预先构建的条件hash查询:

event = Event.find(:all, :conditions => conditions).first