1

我正在尝试从 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,然后让我的查询以某种方式获取具有四级深度的子​​任务的任务?

4

1 回答 1

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))
于 2013-01-09T23:36:10.937 回答