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_to
和 has_many
相关的两个模型之外,你想要关联删除父模型时要删除的模型。这就是 dependent: :destroy
的用武之地。
现在,您需要在代码中为与用户相关的 orders
执行以下操作,以便在用户为:
时将其删除
class User < ActiveRecord::Base
has_many :orders, dependent: :destroy
end
来源:Rails Guides
我正在经历 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_to
和 has_many
相关的两个模型之外,你想要关联删除父模型时要删除的模型。这就是 dependent: :destroy
的用武之地。
现在,您需要在代码中为与用户相关的 orders
执行以下操作,以便在用户为:
class User < ActiveRecord::Base
has_many :orders, dependent: :destroy
end
来源:Rails Guides