Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 类似的Rails传递具有三个值的动态属性_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 4_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 类似的Rails传递具有三个值的动态属性

Ruby on rails 类似的Rails传递具有三个值的动态属性,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Ruby On Rails 5,我有搜索查询,在那里我需要传递动态搜索属性和值。在下面的查询中,我正在传递所有字段,但这些字段不是动态的,这意味着在搜索中有时只会出现名字,有时会出现名字和姓氏,有时会出现名字随年龄变化的情况 如何根据在搜索方法中找到传递这些属性和值的最佳方式 Product.where( 'first_name like ? OR last_name like ? OR age BETWEEN ? AND ?', params[:first_nm], params[:last_nm], par

我有搜索查询,在那里我需要传递动态搜索属性和值。在下面的查询中,我正在传递所有字段,但这些字段不是动态的,这意味着在搜索中有时只会出现名字,有时会出现名字和姓氏,有时会出现名字随年龄变化的情况

如何根据在搜索方法中找到传递这些属性和值的最佳方式

Product.where(
  'first_name like ? OR last_name like ? OR age BETWEEN ? AND ?',
  params[:first_nm],
  params[:last_nm],
  params[:age_start],
  params[:age_end]
)
这种逻辑可能会有所帮助

level_one_result = Product.where('first_name like ? OR last_name like ?',"%#{params[:first_nm]}%", "%#{params[: last_nm]}%")
if (params[:age_end].to_i > 0 or params[:age_end].to_i > 0)
  if params[:age_start].to_i > 0 and params[:age_end].to_i > 0
     result = level_one_result.where('age >= ? AND age <= ?',params[:age_start].to_i,params[:age_end].to_i)
  elsif params[:age_end].to_i > 0
     result = level_one_result.where('age <= ?',params[:age_end].to_i)
  else
     result = level_one_result.where('age >= ?',params[:age_start].to_i)
  end
else
  result = level_one_result
end
level_one_result=Product.where('first_name like?或last_name like?',“%#{params[:first_nm]}%”,“%#{params[:last_nm]}%”)
if(参数[:age\u end].to\u i>0或参数[:age\u end].to\u i>0)
如果参数[:age\u start].to\u i>0和参数[:age\u end].to\u i>0

result=level_one_result。其中('age>=?和age),如果可以的话,我会更新您的表单以提交参数以反映要搜索的列。然后您可以通过范围使这更容易一些:

ALLOWED_SEARCH_TERMS = %i(first_name last_name).freeze

scope :search, ->(terms) {
  result = all
  terms.slice(*ALLOWED_SEARCH_TERMS).each { |term, value| result = result.where(:"#{term}" => value) }
  result = result.where("age BETWEEN :age_start AND :age_end", terms.slice(:age_start, :age_end)) if terms.key?(:age_start) && terms.key?(:age_end)
  result
}
然后在控制器中,您可以:

Product.search(params)

感谢大家的投入,下面的解决方案对我很有效。 我认为这很容易

params_hash = {}
if first_name
  where_str = 'first_name Ilike :ft_nm'
  params_hash[:ft_nm] = "swapnil"
end

if last_name
  where_str += 'last_name Ilike :lt_nm'
  params_hash[:lt_nm] = "patil"
end 

Product.where(where_str, params_hash)

等等,所有的过滤器都在或和之间?一些在或中,一些在和中,如果可能的话使用gem。我建议。如果你想避免gem,请使用属性和值的params散列。然后循环通过该散列并生成你想要的查询字符串。好的,谢谢,我可以尝试,它不会解决动态属性传递到你应该处理的位置的问题如上所述,我认为我已经写的东西会有所帮助