我正在构建一个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;的顺序显示。等。
答案 0 :(得分:2)
我现在能想到的最好的方法就是做到以下几点。
首先使用您希望数组所在的顺序创建一个变量。
<% role_order = [
"Fullstack Developer", "Backend Developer", "Fronten Developer",
"Engineer", "IOS Developer", "Android Developer",
"Designer", "Business Developer"
] %>
收集您要展示的角色。
<% new_roles = @jobs.map(&:role).select(&:present?).uniq %>
使用Array#&方法对数组进行排序。这将采用两个数组的交集(输出两个数组中的项)。按照您调用方法的数组(第一个数组)确定的顺序。
<% new_roles = role_order & new_roles %>
注意:如果您遗失了
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) %>