如何在 liquid 模板中使用 ransack 搜索多个模型

How to search multiple models with ransack in liquid templates

我正在尝试在视图中具有液体模板的 rails 应用程序中实现对 3 个模型的搜索搜索。到目前为止,我已经能够实现对一个模型的搜索。 在我的搜索控制器中,我有;

class SearchController < ApplicationController
  def index
    @courses = Course.ransack(params[:q])

    # @teachers = Teacher.ransack(params[:q])
    # @articles = Article.ransack(params[:q])    
  end
end

我的 search.html.liquid 是空的,因为我希望搜索栏显示在导航栏中。所以在我的 navbar.html.liquid 中,我包含了这个;

<form class="search" method="get" action="{{ request.url_helpers.courses_path }}">
  <input type="text" placeholder="Search" name="q[title_cont]" value=""  />
  <input type="submit" value="Search" />
</form>

在我的 routes.rb 中,我有

    resources :search, only: [:index]

就像我之前提到的,搜索适用于课程模型,但我也想包括教师和文章模型。对于 Teacher 模型,我想为 Article 模型搜索字段 "firstname_cont" 和 "title_cont"。

如何将对所有 3 个模型的搜索合并到一个适用于 liquid 模板的搜索表单中?

这个答案与 ransack 部分有关,因为我没有使用液体的经验,而且它似乎与手头的问题无关

我假设如下

class Course < ApplicationRecord
  belongs_to :teacher
  has_many :articles
end

您应该能够使用像 title_or_teacher_firstname_or_articles_title_cont 这样的复合属性链,例如

<form class="search" method="get" action="{{ request.url_helpers.courses_path }}">
  <input type="text" placeholder="Search" name="q[title_or_teacher_firstname_or_articles_title_cont]" value=""  />
  <input type="submit" value="Search" />
</form>

此外,您的控制器代码传统上表示为:

class SearchController < ApplicationController
  def index
    @q = Course.ransack(params[:q])
    @courses = @q.result
  end
end