在关联资源的acts_as_tree / acts_as_list顺序之后对集合进行排序

时间:2016-01-18 17:28:06

标签: ruby-on-rails sorting has-many acts-as-list acts-as-tree

我有SuccessCriterion模型同时实现acts_as_treeacts_as_list,因此可以将其排列为排序树层次结构。每个成功标准都可以包含许多Boilerplate个对象。

class SuccessCriterion < ActiveRecord::Base
  has_many :boilerplates

  acts_as_tree order: :position, dependent: :restrict_with_error
  acts_as_list scope: [:parent_id]
end

class Boilerplate < ActiveRecord::Base
  belongs_to :success_criterion
end

我可以通过调用SuccessCriterion.collection_tree来检索正确排序的所有成功标准的平面数组。

现在列出样板时,我希望它们按成功标准的层次结构排序。最简单的方法是什么?我想我必须使用Ruby手动对集合进行排序,但我不确定该怎么做。

更新

我的第一次尝试是以下,但感觉有点笨拙:

def index
  # @boilerplates is provided by ransack

  ordered_boilerplates = []

  SuccessCriterion.collection_tree.each do |success_criterion|
    ordered_boilerplates += @boilerplates.select do |boilerplate|
      boilerplate.success_criterion_id == success_criterion.id
    end
  end

  ordered_boilerplates += @boilerplates.select do |boilerplate|
    boilerplate.success_criterion_id.nil?
  end

  @boilerplates = ordered_boilerplates
end

0 个答案:

没有答案