我想根据收到的参数获取记录。有时我会收到2个参数,有时会收到3个。我编写了一个代码,当所有3个参数都收到时得到结果,但是当我仅收到1个参数时得到0个结果。
示例
Office.where(state: params[:state], type: params[:type]).where("name like ?","%#{params[:name]}%")
当我得到诸如
的值时{state: "KA", type: "private", name: "google"}
但是当我获得唯一的{name:“ google”}时,我没有任何记录
我已经尝试过条件
If params[:name].present? && params[:state].present? && params[:type].present?
query
elsif condition
query
end
让我知道如何解决这个问题或更好的方法
答案 0 :(得分:4)
您可以这样做
在控制器中
filter_params = params.slice(:state, :type, :name)
Office.filter(filter_params)
在Office
模型中
scope :state, -> (state) { where(state: state) }
scope :type, -> (type) { where(type: type) }
scope :name, -> (name) { where("name LIKE ?", "%#{name}%") }
def self.filter(filter_params)
results = where(nil)
filter_params.each do |key, value|
results = results.public_send(key, value) if value.present?
end
results
end
PS:无论参数数量多少,它都会运行一个查询!
希望有帮助!
答案 1 :(得分:3)
如果缺少参数,则该参数可能为空白。如果全部通过它们,将导致类似COPY .docker/prod/nginx.conf /etc/nginx/conf.d/default.conf
的子句。例如,如果仅传递type = ''
,您将得到类似...的信息。
name
您需要删除空白字段。有多种方法可以做到这一点。由于您有一个特殊情况where name like '%google%' and type = '' and state = ''
子句,一种解决此问题的好方法是逐段构建查询。
name
只有从query = Office.all
query = query.where(state: params[:state]) if params[:state].present?
query = query.where(type: params[:type]) if params[:type].present?
query = query.where("name like ?","%#{params[:name]}%") if params[:name].present?
中获取值后,查询才会执行。
如果有很多简单的参数,您可以创建一个哈希并删除具有空白值的对。
query
或使用方便的compact_blank gem。
qparams = {
state: params[:state],
type: params[:type]
}.select { |k,v|
v.present?
}
query = Office.where(qparams)
query = query.where("name like ?","%#{params[:name]}%") if params[:name].present?