2015-09-11 45 views
1

我正在通过Rails协会link。但我无法理解协会是如何运作的。我正在使用MySQL数据库。Rails协会和删除

这些是我生成的文件:

user.rb

class User < ActiveRecord::Base 
    has_many :orders 
end 

order.rb

class Order < ActiveRecord::Base 
    belongs_to :user 
end 

20150911181301_create_orders.rb

class CreateOrders < ActiveRecord::Migration 
    def change 
    create_table :orders do |t| 
     t.string :content 
     t.integer :user_id 

     t.timestamps null: false 
    end 
    end 
end 

20150911181351_create_users.rb

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     t.string :name 
     t.string :email 

     t.timestamps null: false 
    end 
    end 
end 

首先,我期待分贝:迁移会产生一些外键关系本身,但它并没有发生。然后我想可能是rails在内部管理它,但是当我通过rails c删除了一个用户时,它并没有从订单表中删除相应的订单。

我的理解错在哪里?也给我一些链接,解释它是如何工作的?

回答

1

这是有争议的,但传统的'Rails方式'是管理模型相关的东西,比如默认值,外键和触发器位于ActiveRecord级而不是数据库中。

这就是说,您可以自由使用,以增加对参照完整性的外键在迁移以下内容:

​​

更多信息可在Rails Guides

在销毁父项时自动销毁子对象的“Rails方式”是在子集合上指定:dependent策略。有一个伟大的Stackoverflow讨论here详细介绍了两个:dependent选项::destroy vs :delete_all

1

一切都在文档

- 你应该注意的是“在任何情况下,Rails会不会为你创建外键列。你需要明确其定义为您的迁移的一部分。”

- 你还应该注意的是,当涉及到关联,Rails需要你告诉它的旁白正在与belongs_tohas_many相关的两款车型,要在它的父模型被删除要删除的相关模型。这就是在dependent: :destroy进来

现在你需要在你的代码做了orders相关用户被删除,当用户为:

class User < ActiveRecord::Base 
    has_many :orders, dependent: :destroy 
end 

来源:Rails Guides