我有一个在某些特定情境下直接与自身联系的模型,有点像这样:
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之前,其他所有错误都会出错。我做错了什么?