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