Rails 与迁移的递归关联

Rails recursive association with migrations

我有一个 table 命名节点。每个节点都属于同一个 table 的一个父亲,并且在同一个 table 上也有一个 child。这是节点模型:

class Node < ApplicationRecord
    belongs_to :parent # I tried using :node instead of :parent
    has_one :children # Same than above
end

我怎样才能轻松做到这一点?

Self-Referential Association

class Node < ApplicationRecord
    belongs_to :parent , :class_name => "Node", :foreign_key => "parent_id", optional: true
    has_one :child, :class_name => "Node", :foreign_key => "parent_id" 
end

在那种情况下,您应该在 Node 模型中有 parent_id。同样对于 has_one 关系,按照惯例它应该是 child 而不是 children

查询将是这样的:-

parent = Node.create(parent_id: nil)
child = Node.create(parent_id: parent.id)

获取所有 parent =>

Node.where(parent_id: nil)

获取 child 个 parent =>

parent.child

我相信你正在寻找的是这样的东西:

class CreateNodes < ActiveRecord::Migration[5.0]
  def change
    create_table :nodes do |t|
      t.belongs_to :parent, 
        foreign_key: { to_table: :nodes },
        null: true

      t.timestamps
    end
  end
end

class Node < ApplicationRecord
  belongs_to :parent, class_name: 'Node', optional: true
  has_many :children, class_name: 'Node', foreign_key: 'parent_id'
end

它在一个节点和它的子节点之间建立了一个自引用的一对多关联。