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レベルの深さのタスクをフェッチできるようにするにはどうすればよいですか?

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 に答える