Ruby on rails 3 Rails3:使用祖先宝石选择n+1? 要求:

Ruby on rails 3 Rails3:使用祖先宝石选择n+1? 要求:,ruby-on-rails-3,nested-sets,Ruby On Rails 3,Nested Sets,我正在构建一个任务列表应用程序,希望任务能够有子任务。 我还希望任务能够同时存在于树中的多个位置,例如,如果我有两个任务: 建狗舍 竖起新篱笆 如果我计划用与围栏相同的材料建造狗窝,那么这两项任务都会有一个子任务“购买围栏围栏” 我有问题的实施反馈欢迎: 我有两种型号: 节点具有\u祖先并属于\u:任务 任务有多个:节点 这意味着允许我拥有子任务的树本身并不存储任务,只是对任务对象的引用 以下是使用rails控制台的示例: t1 = Task.create :name => "Build

我正在构建一个任务列表应用程序,希望任务能够有子任务。 我还希望任务能够同时存在于树中的多个位置,例如,如果我有两个任务:

建狗舍 竖起新篱笆 如果我计划用与围栏相同的材料建造狗窝,那么这两项任务都会有一个子任务“购买围栏围栏”

我有问题的实施反馈欢迎: 我有两种型号:

节点具有\u祖先并属于\u:任务 任务有多个:节点 这意味着允许我拥有子任务的树本身并不存储任务,只是对任务对象的引用

以下是使用rails控制台的示例:

t1 = Task.create :name => "Build dog kennel"
n1 = Node.create :task => t1

t2 = Task.create :name => "Put up new fence"
n2 = Node.create :task => t2

t3 = Task.create :name => "Buy fence palings"
n11 = Node.create :task => t3, :parent => n1
n21 = Node.create :task => t3, :parent => n2

t4 = Task.create :name => "Construct the fence"
n22 = Node.create :task => t4, :parent => n2

n2.children.each { |c| puts c.task.name }
最后一行给出以下输出,表示选择n+1:

Node Load (0.2ms)  SELECT "nodes".* FROM "nodes" WHERE "nodes"."ancestry" = '12'
Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = 11 LIMIT 1
Buy fence palings
Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = 10 LIMIT 1
Put up new fence
帮助 我对RubyonRails和ActiveRecord非常陌生,但我认为我需要做的就是基于nodes.task_id外键将nodes表与tasks表连接起来,但是我已经查看了,找不到任何有用的内容

将来,我还计划通过外键从任务对象获取更多信息,如作者、相关评论等。通过这种实现,一次页面加载可能会触发大量select查询:

有谁能给我一些建议来实现这一点吗? 有没有办法强迫你迫不及待地加载?那会有帮助吗? 如果你对如何完成这项工作有更好的想法,我愿意接受反馈


提前谢谢

所以在玩了一段时间之后,我终于找到了一种方法来做到这一点

而不是这一行:

n2.children.each { |c| puts c.task.name }
n2.children.find(:all, :include => :task).each { |c| puts c.task.name }
其结果是:

Node Load (0.2ms)  SELECT "nodes".* FROM "nodes" WHERE "nodes"."ancestry" = '27'
Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = 23 LIMIT 1
Buy fence palings
Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = 24 LIMIT 1
Construct the fence
我用了这句话:

n2.children.each { |c| puts c.task.name }
n2.children.find(:all, :include => :task).each { |c| puts c.task.name }
其结果是:

Node Load (0.2ms)  SELECT "nodes".* FROM "nodes" WHERE "nodes"."ancestry" = '27'
Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" IN (23, 24)
Buy fence palings
Construct the fence
这应该只执行2个查询,无论大小,结果集将包括任务! 我知道这可能是一些基本的东西,但对于像我这样的新手来说,这可能有点让人困惑,因为类方法只包含