在 Rails 5.1 模板中显示来自 pg_search 的循环计数

Display loop count from pg_search in Rails 5.1 template

我有一个可过滤的产品页面,该页面使用 pg_search gem has_many 变体,效果很好。我试图将搜索结果的总数显示为结果显示的一部分。正如您在下面看到的那样,我所做的工作部分起作用了——它显示了变化的数量,但没有显示总数量;它显示了每个产品的数量。

products_controller.rb

  def index
    @products =
        if params[:query]
          @albums = Album.where(name: params[:query])
          Product.search_for(params[:query])
        else
          # @albums - products is the default image gallery for all products index page
          @albums = Album.where(name: 'products')
          Product.order(:name)
        end
  end

products/index.html.erb

...
<% @products.each do |p| %>
    <%= p.variations.count %> - variations
<% end %>
...

显示内容的屏幕截图

对于下面显示的结果,它循环遍历 2 个产品,每个产品都有 1 个变体,因此它将它们单独列出而不是加起来作为总数。它应该显示的是2 - variations。我明白为什么要这样做;我只是不清楚如何收集结果,将它们相加并显示计数。

你能在你的循环之外保留一个 运行 计数吗,例如:

...
<% total_variations = 0 %>
<% @products.each do |p| %>
    <% total_variations += p.variations.count %>
    <%= total_variations %> - variations
<% end %>

您只需使用 with_index 即可完成此操作,例如遵循以下代码

...
<% @products.each.with_index(1) do |p, index| %>
   <%= index %> - variations
<% end %>
...

或者如果您想从零开始,请遵循以下代码

...
<% @products.each_with_index do |p, index| %>
   <%= index %> - variations
<% end %>
...

希望对您有所帮助

最好从控制器操作本身设置总计数。如果我们可以通过数据库查询本身获得它,则循环遍历每个产品以获得总变化计数并不好。

def index
  ...
  @total_variations = Variation.joins(:product).where(product: @products).count
end

视图中可以使用计数变量。

<%= @total_variations %> - variations