belongs_to 和引用实际上在 table 中创建关系?
belongs_to and references actually create relations in table?
我在 ruby rails 4.2。现在使用关系并尝试在 ContosoUniversity of .net MVC 示例中所示的 Instructor 和 Office_Assignments 之间创建一对一关系。请点击here查看关系详情
在 ruby 我正在关注 this 教程。
我使用以下命令添加了 Instructor 模型。
rails g model Instructor LastName:string FirstMidName:string HireDate:date
然后像下面这样创建 Office_Assignments
rails g model OfficeAssignments Location:string
现在我更新了模型 类 如下关系。
class Instructor < ActiveRecord::Base
has_one :office_assignment
end
class OfficeAssignment < ActiveRecord::Base
belongs_to :instructor
end
在 create_office_assignments 迁移文件中,我对关系进行了如下更改
class CreateOfficeAssignments < ActiveRecord::Migration
def change
create_table :office_assignments do |t|
t.belongs_to :instructor
t.string :Location
t.timestamps null: false
end
end
end
所以当我使用 migrate 命令时,创建的表和列如下 mysql
mysql>描述 office_assignments;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| instructor_id | int(11) | YES | | NULL | |
| Location | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
但是当我检查如下关系时,它没有创建任何外键关系。
mysql> select table_name, column_name, constraint_name, referenced_table_name, referenced_column_name 来自 information_schema.key_column_usage 其中 constraint_schema = 'ContosoUniversity';
+--------------------+-------------+--------------------------+-----------------------+------------------------+
| table_name | column_name | constraint_name | referenced_table_name | referenced_column_name |
+--------------------+-------------+--------------------------+-----------------------+------------------------+
| instructors | id | PRIMARY | NULL | NULL |
| office_assignments | id | PRIMARY | NULL | NULL |
| schema_migrations | version | unique_schema_migrations | NULL | NULL |
| students | id | PRIMARY | NULL | NULL |
+--------------------+-------------+--------------------------+-----------------------+------------------------+
4 rows in set (0.00 sec)
我很困惑为什么不创建外键或者我在迁移或某些地方遗漏了任何东西?我还需要将主键和外键设置为同一列。我读到 add_foriegn_key,但不明白
运行
rails g model Instructor LastName:string FirstMidName:string HireDate:date
rails g model OfficeAssignments Location:string instructor:references
将创建数据库级约束,将 belongs_to/has_one 添加到模型,然后检查生成的迁移文件。在那里你还可以添加 on_update: 'delete' 等等。
Rails 默认情况下不创建外键约束(只有从 4.2 开始,您才能够在不使用原始 sql 或额外的 gem 的情况下执行此操作)
如果你把
add_foreign_key :office_assignments, :instructors
在迁移中,它会添加约束(如果我没记错的话,还有一个变体可以与更改 table 块一起使用)
在 rails 4.2.1(尚未发布)中,您将能够做到
t.belongs_to :instructor, foreign_key: true
一次搞定
我像下面这样更改了我的迁移,也在模型中更改了我的主键
class CreateOfficeAssignments < ActiveRecord::Migration
def change
create_table :office_assignments, :id => false do |t|
t.primary_key :Instructor_Id
t.string :Location
t.timestamps null: false
end
add_foreign_key :office_assignments, :instructors, column: :Instructor_Id, primary_key: "Id"
end
end
class OfficeAssignment < ActiveRecord::Base
set_primary_key :Instructor_Id
belongs_to :instructor
end
我在 ruby rails 4.2。现在使用关系并尝试在 ContosoUniversity of .net MVC 示例中所示的 Instructor 和 Office_Assignments 之间创建一对一关系。请点击here查看关系详情
在 ruby 我正在关注 this 教程。
我使用以下命令添加了 Instructor 模型。
rails g model Instructor LastName:string FirstMidName:string HireDate:date
然后像下面这样创建 Office_Assignments
rails g model OfficeAssignments Location:string
现在我更新了模型 类 如下关系。
class Instructor < ActiveRecord::Base
has_one :office_assignment
end
class OfficeAssignment < ActiveRecord::Base
belongs_to :instructor
end
在 create_office_assignments 迁移文件中,我对关系进行了如下更改
class CreateOfficeAssignments < ActiveRecord::Migration
def change
create_table :office_assignments do |t|
t.belongs_to :instructor
t.string :Location
t.timestamps null: false
end
end
end
所以当我使用 migrate 命令时,创建的表和列如下 mysql
mysql>描述 office_assignments;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| instructor_id | int(11) | YES | | NULL | |
| Location | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
但是当我检查如下关系时,它没有创建任何外键关系。
mysql> select table_name, column_name, constraint_name, referenced_table_name, referenced_column_name 来自 information_schema.key_column_usage 其中 constraint_schema = 'ContosoUniversity';
+--------------------+-------------+--------------------------+-----------------------+------------------------+
| table_name | column_name | constraint_name | referenced_table_name | referenced_column_name |
+--------------------+-------------+--------------------------+-----------------------+------------------------+
| instructors | id | PRIMARY | NULL | NULL |
| office_assignments | id | PRIMARY | NULL | NULL |
| schema_migrations | version | unique_schema_migrations | NULL | NULL |
| students | id | PRIMARY | NULL | NULL |
+--------------------+-------------+--------------------------+-----------------------+------------------------+
4 rows in set (0.00 sec)
我很困惑为什么不创建外键或者我在迁移或某些地方遗漏了任何东西?我还需要将主键和外键设置为同一列。我读到 add_foriegn_key,但不明白
运行
rails g model Instructor LastName:string FirstMidName:string HireDate:date
rails g model OfficeAssignments Location:string instructor:references
将创建数据库级约束,将 belongs_to/has_one 添加到模型,然后检查生成的迁移文件。在那里你还可以添加 on_update: 'delete' 等等。
Rails 默认情况下不创建外键约束(只有从 4.2 开始,您才能够在不使用原始 sql 或额外的 gem 的情况下执行此操作)
如果你把
add_foreign_key :office_assignments, :instructors
在迁移中,它会添加约束(如果我没记错的话,还有一个变体可以与更改 table 块一起使用)
在 rails 4.2.1(尚未发布)中,您将能够做到
t.belongs_to :instructor, foreign_key: true
一次搞定
我像下面这样更改了我的迁移,也在模型中更改了我的主键
class CreateOfficeAssignments < ActiveRecord::Migration
def change
create_table :office_assignments, :id => false do |t|
t.primary_key :Instructor_Id
t.string :Location
t.timestamps null: false
end
add_foreign_key :office_assignments, :instructors, column: :Instructor_Id, primary_key: "Id"
end
end
class OfficeAssignment < ActiveRecord::Base
set_primary_key :Instructor_Id
belongs_to :instructor
end