查询参数

时间:2019-10-21 18:05:31

标签: ruby-on-rails

我想根据收到的参数获取记录。有时我会收到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

让我知道如何解决这个问题或更好的方法

2 个答案:

答案 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?