Возможна ли двухслойная модель в Ruby on Rails?

#ruby-on-rails #loops

#ruby-on-rails #циклы

Вопрос:

Вот список продуктов, упорядоченных по цвету :

КРАСНЫЙ

Product red 1 Product red 2 Product red3

Синий

Продукт синий 1

Желтый

Продукт Желтый 1

Для этого я должен различать продукты в контроллере :

 @productscolor={}
@products.each do |product|
   @productscolor=[product.color][product]
end
  

Но в представлении, как мне этим управлять?

я думаю, у меня будут _colorproduct.erb и _colorproductdetail.erb.

Как называется этот вид представления с двойным циклом? Выполнимо ли это в rails?

Ответ №1:

На самом деле вам нужна группа по перечислению

 @productscolor = @products.group_by{|x|x.color}
  

Это означает, что ваша переменная экземпляра @productscolor теперь имеет

 {"Yellow" => [Product1, Product2], "Red" => [Product3, Product4], ...}
  

Вы можете отсортировать ключи этого хэша массивов и получить цвет, а затем отобразить частичную коллекцию продуктов. В представлении —

 <% @productscolor.keys.sort.each do |color| %>
   <%= color %>
   <%= render :partial => 'colorproductdetail', :collection => @productscolor[color] %>
<% end %>
  

Модифицируйте на досуге.

Ответ №2:

Короткое имя «сломано», потому что вы продолжаете переназначать @productscolor 😉

Вам нужен хэш с цветом в качестве ключа и список продуктов этого цвета в качестве значения.

 m = Hash.new([])
@products.each do |p|
    m[p.color] << p
end
  

Затем используйте частичную коллекцию для продуктов каждого цвета.