【问题标题】:How to display ransack checkbox in custom order如何按自定义顺序显示洗劫复选框
【发布时间】:2018-05-10 09:42:25
【问题描述】:

我正在构建一个 Rails 工作应用程序并使用 ransack gem。在创建职位发布时,用户可以从集合中选择职位类型。 这是那个的代码

<%= 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”等顺序显示。

【问题讨论】:

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


    【解决方案1】:

    我现在能想到的最好方法是执行以下操作。

    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 数组中缺少元素,则在第 3 步之后它们将不会出现在您的 new_roles 数组中。确保所有可能性都存在于 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) %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      相关资源
      最近更新 更多