将模型对象的名称映射到 Rails 5.1 中的 pg_search 查询参数

Map name of model object to a pg_search query param in Rails 5.1

我有一个 album 模型,它有一个 'cover_image' 和 has_many 'images'。我还有一个 product 模型。我正在使用 pg_search 来过滤我的产品。

独立地,它们都能完美地工作。我想做的是根据 pg_search 过滤器参数显示相册 cover_image

例如:如果我有一个名为 "limestone" 的过滤器参数,我将创建一个名为 "limestone" 的相册,当用户按石灰石过滤页面时,他们将获得产品结果以及匹配 cover_image.

product_controller - 这适用于过滤

  def index
    @products = if params[:query]
                  Product.search_for(params[:query])
                else
                  Product.order(:name)
                end
  end 

product_controller - 这会破坏页面 我尝试这样做是为了保持简单并过滤模型中的图像

  def index
    @products = if params[:query]
                  Product.search_for(params[:query])
                  *@albums = Album.where(name:(params[:query]))*
                else
                  Product.order(:name)
                end
  end

products/index.html.erb 然后我会像往常一样调用 album

...
<% @albums.each do |a| %>
    <%= image_tag("#{a.cover_image_url(:original)}") %>
<% end %>
...

问题是您将 @albums 分配给 @products。这实际上就是您正在做的事情:

@products = @albums = Album.where(name: (params[:query]))

因为 if 语句返回 @albums。所以这应该有效(假设您的其余逻辑是正确的):

def index
  @products = if params[:query]
                @albums = Album.where(name: params[:query])
                Product.search_for(params[:query])
              else
                Product.order(:name)
              end
end

但是,我不会在您现在这样做的地方分配@albums。我认为这更清楚,因此 稍微 更好:

def index
  if params[:query]
    @products = Product.search_for(params[:query])
    @albums   = Album.where(name: params[:query])
  else
    @products = Product.order(:name)
    @albums   = []
  end
end