rails:在每个循环中显示唯一记录

时间:2013-02-06 17:26:14

标签: ruby-on-rails ruby

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

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

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

3 个答案:

答案 0 :(得分:5)

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

<% @products.map(&:user).uniq.each do |u| %>
  <%= link_to u.profile.first_name, store_index_path %>
<% end %>

答案 1 :(得分:1)

您可以使用group_by创建User =&gt;的哈希值[产品]。然后,您遍历唯一的用户集,显示有关该所有者的信息,然后显示该用户的每个产品。

<% 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 %>

答案 2 :(得分: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 %>