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

时间:2018-02-26 19:40:51

标签: ruby-on-rails ruby-on-rails-5 pg-search

我有一个album模型,有一个'cover_image'和has_many'图像'。我也有一个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 %>
...

1 个答案:

答案 0 :(得分:1)

问题是您要将@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