创建没有外键的单向关系

时间:2017-11-17 05:22:01

标签: ruby-on-rails activerecord

我在某些模特之间试图形成关系时遇到问题。

我有一个节点,它有很多 NodeTasks 。这是建模的,以便NodeTask belongs_to :node,按预期工作。

我还想在节点上添加对任意 NodeTask 的引用 - 让我们说first_node_task作为可选属性。这就是我遇到麻烦的地方。

我能够将它一起破解,以便node.first_node_task可以按照预期设置并按照以下迁移工作:

add_reference :nodes, :first_node_task, { type: :uuid, foreign_key: { to_table: :node_tasks } }

模特:

class Node
  belongs_to :first_node_task, class_name: 'NodeTask', foreign_key: 'first_node_task_id', optional: true
end

但是,由于引用了 NodeTask ,我发现我无法再删除那些节点。外键约束发生了一些奇怪的反向关系:ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: update or delete on table "nodes" violates foreign key constraint "fk_rails_696709283b" on table "node_tasks"

如何对参考文献进行建模,以便节点可以设置first_node_task,这是对任意 NodeTask 的引用,而不会影响相关 NodeTask

2 个答案:

答案 0 :(得分:0)

尝试将dependent: :nullify添加到

class Node
    belongs_to :first_node_task, class_name: 'NodeTask', foreign_key: 'first_node_task_id', optional: true, dependent: :nullify
end

答案 1 :(得分:0)

事实证明我正在尝试做的事情没有意义。

与我的first_node_task属性无关,Nodes有一组NodeTasks,因此NodeTasks删除Node时需要进行某些操作。无论孩子NodeTasks发生什么,都会发生在first_node_task,因为它是其中之一。

我意识到我实际上希望删除NodeTasks,这意味着如果设置first_node_task,它也会被删除。

我通过添加迁移来解决此问题,以便在删除时将NodeTaskNode之间的外键更改为级联,如下所示:

remove_foreign_key :node_tasks, :nodes
add_foreign_key :node_tasks, :nodes, on_delete: :cascade