使用Ransack搜索与多个搜索查询匹配的记录

时间:2015-11-22 17:08:47

标签: ruby-on-rails ransack

我正在构建一个食谱搜索,我将返回与多个成分查询匹配的记录。例如,如果我输入“Chicken”和“Carrots”,我的结果应该只返回包含Chicken和Carrots的食谱。

到目前为止,我只使用一个查询就能很好地完成搜索。不幸的是,我无法在Ransack文档中的任何地方找到如何使用多个查询进行搜索。

def index
if params[:query]
  @q = Recipe.ransack(ingredients_name_cont: params[:query])
  @recipes = @q.result(distinct: true)
else
  @recipes = Recipe.all
end

render json: @recipes
end

有什么想法吗?谢谢!

编辑:要添加到上面的描述,我使用Rails作为我的API。我不会在Rails中构建模板,因此无法使用任何表单助手。

编辑2:更仔细地查看文档(https://github.com/activerecord-hackery/ransack/wiki/basic-searching),似乎cont_any非常接近我需要的东西,除了不返回匹配其中一个的记录,我需要返回记录两个匹配。想法?

1 个答案:

答案 0 :(得分:1)

您应该在控制器中进行搜索,如下所示:

  def search
    @q = Recipe.ransack(params[:q])
    @recipes = @q.result(distinct: true).published.include_related_models
  end

并构建这样的搜索表单(在我的案例中为HAML):

.container
  %h3 Zoek recepten
  = search_form_for @q, url: search_recipes_path do |f|
    .input-group
      = f.search_field :title_cont, class: 'form-control', placeholder: 'Uw zoekterm'

对于嵌套关系,我使用类似的东西:

= f.collection_select(:recipe_categorizations_recipe_category_id_in, RecipeCategory.all, :id, :name,{}, {multiple: true, class: 'chosen-select form-control'})

这是为了搜索RecipeCategorization模型的recipe_category_id(与RecipeCategory有关)

更新:这就是我的params [:q]的样子。可能需要在参数名称中解决正确的关系:

{"title_cont"=>"name", "recipe_categorizations_recipe_category_id_in"=>["", "4"], "ingredients_item_id_in_all"=>["", "2"], "steps_technique_id_in"=>["", "2"], "difficulty_in"=>"1"}