Rails关联和删除

时间:2015-09-11 18:33:47

标签: mysql ruby-on-rails associations

我正在通过Rails协会link。但我无法理解协会是如何运作的。我正在使用mysql db。

这些是我生成的文件:

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

首先我期待db:migrate会自己产生一些外键关系,但它没有发生。然后我想可能是rails在内部管理它,但当我通过rails c删除用户时,它没有从订单表中删除相应的订单。

我的理解在哪里不正确?还给我一些链接,解释这是如何工作的?

2 个答案:

答案 0 :(得分:1)

这是有争议的,但传统的Rails方式&#39;是管理与模型相关的事情,如默认值,外键和触发器是在ActiveRecord级别而不是在数据库中。

也就是说,您可以使用以下内容在迁移中为参照完整性添加外键:

add_foreign_key :orders, :users

Rails Guides提供了更多信息。

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

答案 1 :(得分:1)

一切都在文档中

- 您应该注意&#34; 在任何情况下,Rails都不会为您创建外键列。您需要明确定义它们作为迁移的一部分。&#34;

- 您还应该注意到,当涉及到关联时,Rails需要您告诉它除了两个与belongs_tohas_many相关的模型之外,您希望删除关联的模型。 #39;删除父模型。这就是dependent: :destroy的用武之地。

现在,您需要在代码中执行与用户相关的orders代码,以便在用户访问时删除:

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

来源:Rails Guides