我需要构建一个带有2个传入参数的动态sql队列。定义两个参数时很容易。
MyClass.where(:column1 => param[:first], :column2 => params[:second])
但是,例如param[:first] = 0
时,我想为此列选择所有(非空)字段(因此,当两个参数都为= 0时,它将等于select * from tablename
)。试过这种语法:
MyClass.where(:column1 => param[:first], :column2 => !nil)
但它给了我错误的输出。有什么建议如何优雅地解决这个问题?
答案 0 :(得分:2)
您可以使用?:
内的where
运算符:
MyClass.where(params[:first] ? {:column1 => params[:first]} : "column1 IS NOT NULL")
.where(params[:second] ? {:column2 => params[:second]} : "column2 IS NOT NULL")
答案 1 :(得分:1)
MyClass.where('column1 IS NOT NULL AND column2 IS NOT NULL').where({:column1 => params[:first], :column2 => params[:second]}.delete_if{|k,v| v.nil?})
怎么样?
答案 2 :(得分:1)
我认为这可能与我发现的有关。它似乎在rails控制台中工作,并考虑活动记录alows活动链接:
MyClass.where(:column1 => params[:first], :column2 => params[:second]).where("column1 is NOT NULL").where("column2 is NOT NULL")