我想在我的列表页面中按字母对公司进行分类。
但是有多个记录以相同的字母开头。我可以使用.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 %>
我如何只显示独特的字母?
答案 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)
您正在遍历所有公司,因此如果您有Facebook
和Foxtel
等公司,则会复制带有F
标记的链接。你可以做点什么
categories = @companies.where(brand_id: @brand.id).pluck(:name).map(&:first).uniq
在上面的代码中,它所做的只是获取公司名称列表并提取出第一个字母并删除重复项。
现在,您可以遍历类别并为类别创建链接,在类别页面内,您可以从该信件开始获取公司
Company.where('name LIKE ?', "%#{starting_character}%")
starting_character
从类别列表页面发送。