将 x 元素移动到数组的末尾

Move x element to the end of an array

我试图找到一种方法来获取特定关系并将其移动到数组的末尾。基本上,我有一个 current_account 并且我想使用这个帐户并将其移动到帐户关系数组的末尾,以便在我对关系进行迭代时它会显示在最后。如果可能的话,我想制作一个范围并使用 SQL,这是我的尝试,但我还没有真正取得任何进展。

HTML

<% current_user.accounts.current_sort(current_account).each do |account| %>
   <li><%= link_to account.name, switch_account_accounts_path(account_id: account.id) %></li>
<% end %>

当前 return 个按 created_at 个帐户排序的列表。我不希望它按 created at 排序,但 current_account 位于底部,所以我创建了一个名为 current_sort 的范围,但我不确定在这里做什么。

CURRENT_SORT 帐户范围

 scope :current_sort, lambda { |account|

 }

我希望此范围return 关联数组中最后传入的帐户。我如何使用 SQL 或 Ruby 执行此操作?

将特定元素排序到数组末尾的快速技巧是:

array.sort_by { |v| v == current_account ? 1 : 0 }

如果你想移动多个元素,这样做更容易:

to_end = [ a, b ]

array - to_end + to_end

编辑: 正如 Stefan 指出的那样,这可能会重新订购商品。要解决这个问题:

array.sort_by.with_index do |v, i|
  v == current_account ? (array.length + i) : i
end

您也可以使用 partition:

以不同的方式处理它
array.partition { |v| v != current_account }.reduce(:+)

这是 Stefan 在他们的回答中使用的方法的变体。

您可以使用partition按条件拆分数组。

array = [1, 2, 3, 4, 5, 6, 7, 8]
current_account = 3

other_accounts, current_accounts = array.partition { |v| v != current_account }
#=> [[1, 2, 4, 5, 6, 7, 8], [3]]

other_accounts
#=> [1, 2, 4, 5, 6, 7, 8]

current_accounts
#=> [3]

结果可以串联:

other_accounts + current_accounts
#=> [1, 2, 4, 5, 6, 7, 8, 3]

或单行:

array.partition { |v| v != current_account }.flatten(1)
#=> [1, 2, 4, 5, 6, 7, 8, 3]

# or

array.partition { |v| v != current_account }.inject(:+)
#=> [1, 2, 4, 5, 6, 7, 8, 3]