如何在Rails中显示唯一的字符串?

时间:2018-01-30 22:11:01

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5

我想在我的列表页面中按字母对公司进行分类。 但是有多个记录以相同的字母开头。我可以使用.first方法获取公司名称的第一个字母。

但我的代码显示重复的字母。

控制器:

 @brand = Brand.where(slug: params[:brand]).first
 @companies = Company.where(brand_id: @brand.id)....

查看:

 <% @companies.each do |c| %>
       <li>
         <%= link_to company_path(c.brand.name,c.id) do  %>
            <%= c.name.first %>
         <% end  %>
       </li>
   <% end %>

我如何只显示独特的字母?

2 个答案:

答案 0 :(得分:2)

新代码(有一些变化,假设公司属于品牌和品牌has_many公司)

@brand = Brand.where(slug: params[:brand]).first
@companies = @brand.companies
#@list is a hash with letters as keys and an array of companies starting with this letter
@list = Hash.new { |h,k| h[k]=[] } 
@companies.each { |comp| @list[comp.name[0]] << comp }

#As “engineersmnky” suggested on a comment the last two sentences can be simplified:
@list = @companies.group_by { |c| c.name[0] }

查看:

<% @list.each do |letter, companies| %>
  <h2><%= letter %><h2>
  <% companies.each do |c| %>     
    <li>
      <%= link_to c.name, c %>
    </li>
  <% end %>
<% end %>

答案 1 :(得分:1)

您正在遍历所有公司,因此如果您有FacebookFoxtel等公司,则会复制带有F标记的链接。你可以做点什么

categories = @companies.where(brand_id: @brand.id).pluck(:name).map(&:first).uniq

在上面的代码中,它所做的只是获取公司名称列表并提取出第一个字母并删除重复项。

现在,您可以遍历类别并为类别创建链接,在类别页面内,您可以从该信件开始获取公司

Company.where('name LIKE ?', "%#{starting_character}%")

starting_character从类别列表页面发送。