我有一个产品展示页面,它在网站上显示所有产品。在这里,我想根据其所有者过滤产品。首先,我使用每个循环在页面上显示所有者名称:
<% @products.each do |p| %>
<%= link_to p.user.profile.first_name, store_index_path %>
<% end %>
但是由于所有者拥有多种产品,因此他的名字会多次显示。如何只显示一次名称?
我有一个产品展示页面,它在网站上显示所有产品。在这里,我想根据其所有者过滤产品。首先,我使用每个循环在页面上显示所有者名称:
<% @products.each do |p| %>
<%= link_to p.user.profile.first_name, store_index_path %>
<% end %>
但是由于所有者拥有多种产品,因此他的名字会多次显示。如何只显示一次名称?
以简单的方式,您可以这样做:
<% @products.map(&:user).uniq.each do |u| %>
<%= link_to u.profile.first_name, store_index_path %>
<% end %>
您可以使用 group_by 创建 User => [Products] 的哈希。然后,您遍历唯一的用户集,显示有关该所有者的信息,然后显示该用户的每个产品。
<% products_by_owner = @product.group_by(&:user) %>
<% products_by_owner.keys.each do |user| %>
<%= link_to p.user.profile.first_name, store_index_path %>
<% products_by_owner[user].each do |product| %>
<%= link_to product.name, store_index_path %>
<% end %>
<% end %>
您可以使用group_by
以用户作为键和产品数组作为值来创建散列:
# Eager loading of users will prevent multiple database hits.
# Using find:
@products = Product.find(:all, :include => :user).group_by(&:user)
# using relations:
@products = Product.where(:some_condition => 'etc').includes(:user).group_by(&:user)
在视图中:
<% @products.each do |user, user_products| %>
<%= link_to p.user.profile.first_name, store_index_path %>
<% user_products.each do |product| %>
...
<% end %>
<% end %>