3

我有一个产品展示页面,它在网站上显示所有产品。在这里,我想根据其所有者过滤产品。首先,我使用每个循环在页面上显示所有者名称:

<% @products.each do |p| %>
   <%= link_to p.user.profile.first_name, store_index_path %>
<% end %>

但是由于所有者拥有多种产品,因此他的名字会多次显示。如何只显示一次名称?

4

3 回答 3

5

以简单的方式,您可以这样做:

<% @products.map(&:user).uniq.each do |u| %>
  <%= link_to u.profile.first_name, store_index_path %>
<% end %>
于 2013-02-06T17:37:36.297 回答
1

您可以使用 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 %>
于 2013-02-06T17:30:01.753 回答
0

您可以使用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 %>
于 2013-02-06T17:32:01.890 回答