Ruby on rails Ruby/Rails:构建对象嵌套数组的有效方法

Ruby on rails Ruby/Rails:构建对象嵌套数组的有效方法,ruby-on-rails,ruby,performance,nested,self-referencing-table,Ruby On Rails,Ruby,Performance,Nested,Self Referencing Table,我正在开发一个处理地方的API。我有一个表,它是作为自引用构建的,包含一个parent\u id列。到目前为止,我在该表中有144条记录 我们的客户端应用程序需要接收嵌套的位置。因为我使用的是Rails,所以一开始我尝试使用序列化程序的功能来为我实现这一点: class LocalitySerializer < ActiveModel::Serializer attributes :id, :name, :postcode, :kind, :latitude, :longitude,

我正在开发一个处理地方的API。我有一个表,它是作为自引用构建的,包含一个
parent\u id
列。到目前为止,我在该表中有144条记录

我们的客户端应用程序需要接收嵌套的位置。因为我使用的是Rails,所以一开始我尝试使用序列化程序的功能来为我实现这一点:

class LocalitySerializer < ActiveModel::Serializer
  attributes :id, :name, :postcode, :kind, :latitude, :longitude, :parent_id

  has_many :childrens
end
并在自己的序列化程序中单独构建它:

class LocalitySerializer < ActiveModel::Serializer
  attributes :id, :name, :postcode, :kind, :latitude, :longitude, :parent_id
end
class DictionarySerializer < ActiveModel::Serializer
  def attributes
    hash = super
    hash[:localities] = localities
    hash
  end

  private

  def localities
    Rails.cache.fetch('localities.json', expires_in: 7.days) do
      localities = ActiveModel::ArraySerializer.new(Locality.all, each_serializer: LocalitySerializer).as_json
      build_hierarchy(localities, [], nil)
    end
  end

  def build_hierarchy(source, target_array, n)
    source.select { |h| h[:parent_id] == n }.each do |h|
      h.except!(:parent_id)
      target_array << h.clone.merge(childrens: build_hierarchy(source, [], h[:id]))
    end

    target_array
  end
end
class DictionarySerializer目标数组
有很多:children
-children是child的正确复数形式,而不是
children
。虽然这不是问题的根源,但使用错误的屈折变化会把事情搞得一团糟。@max谢谢你的提醒,并对这个错误表示抱歉(我是法国人)。child=>children;)