我正在通过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
删除用户时,它没有从订单表中删除相应的订单。
我的理解在哪里不正确?还给我一些链接,解释这是如何工作的?
答案 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_to
和has_many
相关的模型之外,您希望删除关联的模型。 #39;删除父模型。这就是dependent: :destroy
的用武之地。
现在,您需要在代码中执行与用户相关的orders
代码,以便在用户访问时删除:
class User < ActiveRecord::Base
has_many :orders, dependent: :destroy
end
来源:Rails Guides