繁体   English   中英

如何为属于自身的rails模型编写迁移

[英]How to write a migration for a rails model that belongs_to itself

模型场景:

A node can belong to a parent node and can have child nodes.

车型/ node.rb

class Node < ActiveRecord::Base                                                                

  has_many :children, class_name: "Node", foreign_key: "parent_id"                             
  belongs_to :parent, class_name: "Node"                                                       

end           

分贝/迁移/ 20131031144907_create_nodes.rb

class CreateNodes < ActiveRecord::Migration
  def change
    create_table :nodes do |t|
      t.timestamps
    end
  end
end   

然后我想做迁移添加关系:

class AddNodesToNodes < ActiveRecord::Migration
  def change
    add_column :nodes, :parent_id, :integer
    # how do i add childen?
  end
end

如何在迁移中添加has_many关系?

您已经完成了所需的一切。您可以在此页面中找到更多信息: 在此输入图像描述

资料来源: http//guides.rubyonrails.org/association_basics.html

node.parent将查找parent_id是节点id并返回父节点。

node.children将发现parent_id是节点id并返回子节点。

当你添加关系时,你可以在Rails 4中这样做:

## rails g migration AddNodesToNodes parent:belongs_to

class AddNodesToNodes < ActiveRecord::Migration
  def change
    add_reference :nodes, :parent, index: true
  end
end

Per RailsGuides ,这是一个自我加入的例子。

# model
class Node < ActiveRecord::Base
  has_many :children, class_name: "Node", foreign_key: "parent_id"
  belongs_to :parent, class_name: "Node"
end

# migration
class CreateNodes < ActiveRecord::Migration
  def change
    create_table :nodes do |t|
      t.references :parent, index: true
      t.timestamps null: false
    end
  end
end

迁移中不需要任何其他内容。 parent_id用于定义两个方向的关系。 特别:

  1. parent - 具有与当前节点的parent_id属性值对应的id的节点。

  2. children - 具有parent_id值的所有节点,该值对应于当前节点的id属性的值。

您已经使用AddNodeToNodes和父ID编写了迁移。

这在数据库级别定义它。

在'rails'级别(ActiveRecord),您可以在模型定义中定义has_many,即定义Node类的Node.rb文件。
添加has_many没有“迁移”。 迁移用于数据库字段(和索引等),例如parent_id但不用于rails样式关系定义,例如has_many

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM