如何根据别名关联的值(或缺少关联值)来更新rails 3中的记录?

时间:2011-10-17 22:26:50

标签: ruby-on-rails-3 join arel

我有一个在某些特定情境下直接与自身联系的模型,有点像这样:

class Node < ActiveRecord::Base
  belongs_to :next_node, :class_name => 'Node'
end
到目前为止,这一直非常有效。但是,我们最近添加了一个约束来修复删除节点时的错误 - 任何指向它的节点都需要更新“下一个节点”以反映它不再具有下一个节点。我添加了一个after_destroy条件:

class Node < ActiveRecord::Base
  after_destroy :clean_tree

  def clean_tree
    Node.where(:next_node_id => self.id).update_all(:node_type => 'leaf')
  end
end

忽略更好的实现(这是一个非常简单的示例,消除了使这个数据模型成为必要的复杂性),这可以按预期工作。对于新创建的结构。但我正在尝试编写迁移来更新旧结构。这就是我的问题所在。我尝试了以下代码。但我无法在同一张桌子上加入工作:

Node.joins(:next_node).where(:next_node => { :id => nil }).update_all(:node_type => 'leaf')

失败。它将连接视为有效,但SQL不会添加连接,并且where子句不识别next_node。它产生类似

的东西
UPDATE nodes SET node_type = 'leaf' WHERE (next_node.id IS NULL)
显然,它并没有引起联想。

我尝试了几种变体,使用了next_node,next_nodes,node,nodes。似乎没什么用。上面的例子是唯一一个实际上足以生成sql的例子。在rails之前,其他所有错误都会出错。我做错了什么?

0 个答案:

没有答案