Как отобразить чекбокс в произвольном порядке - PullRequest
0 голосов
/ 10 мая 2018

Я создаю приложение для работы с рельсами и использую самоцвет. При создании сообщения о работе пользователи могут выбрать тип работы из коллекции. Это код для этого

<%= f.input :role, collection: ["Fullstack Developer", "Backend 
 Developer", "Frontend Developer", "Engineer", "IOS Developer", 
 "Android Developer", "Designer", "Business Developer"], :label => 
 "Role" %>

В моем индексе вакансий я отображаю эту коллекцию с помощью Ransack Код ниже

<div class="filter-style">
  <h4>Roles</h4>
  <% new_roles = [] %>
  <%= search_form_for @search, :class => 'filters_click' do |f| %>
    <% @jobs.each do |job| %>
      <% if job.role? %>
        <% new_roles << job.role %>
      <% end %>
    <% end %>

    <% new_roles.uniq.each do |new_role| %>
      <div class="styled-input-container">
        <a>
          <label>
            <%= check_box_tag('q[role_eq_any][]', new_role) %>
              <%= new_role %>
          </label>
        </a>
      </div>
    <% end %>
  <% end %>
</div>

Я хочу, чтобы коллекция отображалась в том же порядке, что и на новой странице задания. Например, я хочу отображать в порядке «Fullstack Developer», «Backend Developer» и т. Д.

1 Ответ

0 голосов
/ 10 мая 2018

Лучший способ, о котором я могу подумать сейчас, - это сделать следующее.

  1. Сначала создайте переменную в том порядке, в котором вы хотите, чтобы массив находился.

    <% role_order = [
      "Fullstack Developer", "Backend Developer",  "Fronten Developer",
      "Engineer",            "IOS Developer",      "Android Developer",
      "Designer",            "Business Developer"
    ] %>
    
  2. Соберите роли, которые вы собираетесь отображать.

    <% new_roles = @jobs.map(&:role).select(&:present?).uniq %>
    
  3. Упорядочите массив, используя Array #& метод.Это займет пересечение двух массивов (выведите элементы, которые находятся в обоих массивах).В порядке, определяемом массивом, в который вы вызываете метод (первый массив).

    <% new_roles = role_order & new_roles %>
    

Примечание: Если выотсутствующие элементы в вашем массиве role_order не будут присутствовать в вашем массиве new_roles после шага 3. Убедитесь, что все возможности присутствуют в role_order.Если вам нужна дополнительная защита, чтобы не пропустить ни одного элемента, вы можете поднять исключение.

Кроме того, пересечение также удаляет двойные элементы.Вот почему я позаботился о том, чтобы в нем не было двойных элементов (см. Шаг 2), прежде чем делать пересечение, иначе мой пример ниже не сработает (поскольку размер никогда не будет прежним, если убрать двойные элементы).

Пример создания исключения:

<% new_roles2 = role_order & new_roles %>
<% raise 'Missing roles in role_order array!' unless new_roles.size == new_roles2.size %>

В качестве альтернативы вы можете создать модель для рабочих ролей и добавить атрибут заказа.Чем при извлечении порядка экземпляров по этому атрибуту.

<% new_roles = Role.where(id: @jobs.select(:role_id)).order(:order_attr) %>
...