如何以自定义顺序显示ransack复选框

时间:2018-05-10 09:42:26

标签: ruby-on-rails ruby ruby-on-rails-4 simple-form ransack

我正在构建一个rails job app并使用ransack gem。在创建工作岗位时,用户可以从集合中选择工作类型。 这是

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

在我的工作索引中,我用hansack显示这个集合。代码在

之下
<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>

我想要的是以与作业新页面相同的顺序显示集合。例如,我想按照&#34; Fullstack Developer&#34;,&#34; Backend Developer&#34;的顺序显示。等。

1 个答案:

答案 0 :(得分:2)

我现在能想到的最好的方法就是做到以下几点。

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

    注意:如果您遗失了role_order数组中的元素,则在第3步之后它们将不会出现在new_roles数组中。请确保role_order中存在所有可能性1}}。如果你想要一些额外的安全性,你没有错过任何元素,你可以提出一个例外。

         

    此外,交叉点也会移除双元素。这就是为什么我确保它在制作交集之前不包含双元素(参见步骤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) %>