获取任意级别的自引用层次模型

时间:2012-05-05 15:01:21

标签: ruby-on-rails ruby json self-reference

我正在尝试从Rails获取自引用数据。我有一个名为Task的模型,其代码如下:

class Task < ActiveRecord::Base
  has_many :tasks
  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_tasks, through: :relationships, source: :followed
  scope :orphans, :conditions => "id NOT IN (SELECT DISTINCT followed_id FROM relationships)"

在我的控制器中,我想与他们的孩子(子任务)和孙子孙女一起完成所有任务。 到目前为止,我一直这样做:

@tasks = Task.orphans.to_json(:include => { :followed_tasks => {
:include => :followed_tasks}})

这可能不是最有效的方式,但我能提出的方法是有效的。现在,如果我想要更多级别的嵌套,这个代码很快就会难以维护。我怎样才能改进我的代码,以便能够指定像maxLevelsNum = 4之类的变量,然后让我的查询以某种方式获取任务,其子任务的深度为四级?

1 个答案:

答案 0 :(得分:1)

问题被问到已经有一段时间了,但是,你可以在下面找到一个可能的答案(maxLevelsNum需要大于或等于1):

hash_string = constructHash(maxLevelsNum)

def constructHash(treeDepth)
  output = ":include => :followed_tasks"

  (2..treeDepth).each do 
    output = ":include => { :followed_tasks => {" + output + "}}"
  end

  return "{" + output + "}"
end

@tasks = Task.orphans.to_json(eval(hash_string))