Rails 5:如果有很多参数

时间:2017-11-06 06:31:39

标签: ruby-on-rails ruby ruby-on-rails-5

这是编写可以容纳多个参数查询的索引方法的最佳方法吗?

if params.key?(:user_id)
  Post.where(user_id: params[:user_id])
elsif params.key?(:status)
  Post.where(status: params[:status])
elsif params.key?(:user_id) && params.key?(:status)
  Post.where(user_id: params[:user_id], status: params[:status])
else
  Post.all
end

当有两个时,我的方法似乎没有抓住参数。

2 个答案:

答案 0 :(得分:6)

我会使用ActionController::Parameters#slice

post_parmas = params.slice(:user_id, :status)
post_params.empty? ? Post.all : Post.where(post_params)

您的代码问题:如果您有:user_id:status个键,则跳过所有其他逻辑,包括params存在检查。检查两个参数(条件#3)应该是第一个。

答案 1 :(得分:0)

这对你有用

if params.key?(:user_id) && params.key?(:status)
  Post.where(user_id: params[:user_id], status: params[:status])
elsif params.key?(:user_id)
  Post.where(user_id: params[:user_id])
elsif params.key?(:status)
  Post.where(status: params[:status])
else
  Post.all
end

如果您需要根据参数在查询中添加多个条件,则可以使用以下方法。请注意SQL注入。

condition = ""
if(params[:user_id].blank? and params[:user_id].blank?)
    Post.all
else
    condition += "user_id=#{params[:user_id]}" if params.key?(:user_id)
    condition += " AND status=#{params[:status]}" if params.key?(:status)
    Post.where("#{condition}")
end