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

时间:2013-10-31 15:47:55

标签: ruby-on-rails ruby ruby-on-rails-4

模型场景:

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

models / 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关系?

4 个答案:

答案 0 :(得分:11)

您已完成了所需的一切。您可以在此页面中找到更多信息: enter image description here

来源: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

答案 1 :(得分:10)

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

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = RouteParameter.Optional }
       );

        config.Routes.MapHttpRoute(
           name: "DefaultApi2",
           routeTemplate: "api/{controller}" 
       );
    }
}

答案 2 :(得分:1)

迁移中不需要任何其他内容。 parent_id用于定义两个方向的关系。具体做法是:

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

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

答案 3 :(得分:1)

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

它在数据库级别定义它。

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