Rails 关联和删除

Rails associations and deletion

我正在经历 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 删除用户时,它没有从订单 table.

中删除相应的订单

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

这是有争议的,但传统的 'Rails way' 是在 ActiveRecord 级别而不是在数据库中管理与模型相关的事物,例如默认值、外键和触发器。

也就是说,您可以使用以下方法在迁移中自由添加外键以实现参照完整性:

add_foreign_key :orders, :users

Rails Guides 中提供了更多信息。

父对象销毁时自动销毁子对象的'Rails way'是在子集合上指定:dependent策略。有一个很棒的 Whosebug 讨论 here 详细介绍了两个 :dependent 选项::destroy vs :delete_all.

一切都在文档中

-您应该注意“在任何情况下,Rails 都不会为您创建外键列。您需要将它们显式定义为迁移的一部分."

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

现在,您需要在代码中为与用户相关的 orders 执行以下操作,以便在用户为:

时将其删除
class User < ActiveRecord::Base
    has_many :orders, dependent: :destroy
end

来源:Rails Guides