我正在构建一个食谱搜索,我将返回与多个成分查询匹配的记录。例如,如果我输入“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非常接近我需要的东西,除了不返回匹配其中一个的记录,我需要返回记录两个匹配。想法?答案 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"}