Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby能否在不递归的情况下将acts_as_嵌套_集干净地转换为JSON哈希?_Ruby On Rails_Ruby_Recursion - Fatal编程技术网

Ruby on rails Ruby能否在不递归的情况下将acts_as_嵌套_集干净地转换为JSON哈希?

Ruby on rails Ruby能否在不递归的情况下将acts_as_嵌套_集干净地转换为JSON哈希?,ruby-on-rails,ruby,recursion,Ruby On Rails,Ruby,Recursion,在RubyonRails的acts_as_nested_集中,有没有一种快速、干净的方法可以从任何节点返回JSON哈希而不使用递归 以下是供参考的递归解决方案: class Node < ActiveRecord::Base has_many :products def json_hash if children.size > 0 children.collect { |node| { node.name => node.json_hash }.to

在RubyonRails的acts_as_nested_集中,有没有一种快速、干净的方法可以从任何节点返回JSON哈希而不使用递归

以下是供参考的递归解决方案:

class Node < ActiveRecord::Base
  has_many :products
  def json_hash
    if children.size > 0
      children.collect { |node| { node.name => node.json_hash }.to_json
    else
      { node.name => node.products.find(:all).collect(&:name) }.to_json
    end
  end
end
class节点0
children.collect{| node{node.name=>node.json_hash}.to_json
其他的
{node.name=>node.products.find(:all.collect(&:name)}.to_json
结束
结束
结束
有一个树上遍历,它显示了您正在使用的递归解决方案的不同替代方案。在您的特定情况下使用它们可能会很棘手,但这应该是可能的

然而,我的问题是,你想使用迭代而不是递归有什么特别的原因吗?我不认为任何迭代解决方案都会如此干净。你的树是不是太大以至于你的堆栈空间都用完了(它们必须相当大)?否则,我不确定迭代解决方案是否真的会更快

不过,如果您看到性能问题,我看到了一个改进的潜力……但我不了解rails,所以我不确定它是否准确:

find方法是否返回一个新数组?如果是,您可能希望调用.collect!而不是.collect,因为如果find创建一个数组,您只是创建了一个数组,然后将它扔掉给collect调用(它也创建了一个数组),这肯定不是很有效,如果你有一棵大树的话,可能会让你慢下来很多

所以

可能成为

{ node.name => node.products.find(:all).collect!(&:name) }.to_json
class Node < ActiveRecord::Base
  has_many :products
  def json_hash
    to_hash.to_json
  end

  def to_hash
    if children.size > 0
      children.collect { |node| { node.name => node.to_hash }
    else
      { node.name => node.products.find(:all).collect!(&:name) }
    end
  end
end
编辑:另外,创建散列,然后一次性将整个内容转换为json,可能比像现在这样逐段转换更有效

所以

class节点0
children.collect{| node{node.name=>node.json_hash}.to_json
其他的
{node.name=>node.products.find(:all).collect!(&:name)}.to_json
结束
结束
结束
可能成为

{ node.name => node.products.find(:all).collect!(&:name) }.to_json
class Node < ActiveRecord::Base
  has_many :products
  def json_hash
    to_hash.to_json
  end

  def to_hash
    if children.size > 0
      children.collect { |node| { node.name => node.to_hash }
    else
      { node.name => node.products.find(:all).collect!(&:name) }
    end
  end
end
class节点0
children.collect{| node{node.name=>node.to_hash}
其他的
{node.name=>node.products.find(:all.collect!(&:name)}
结束
结束
结束
无论这是否有效,我留给您作为练习;-)

JSONifier

node.to_json(:include=>{:products=>{:include=>:product_parts}})

答案很好,但我一直在寻找一种更为迭代或奇特的Ruby方法来实现这一点。