[英]belongs_to and references actually create relations in table?
我在Rails 4.2上处于红宝石状态。 现在,使用关系并尝试在.net MVC的ContosoUniversity大学的示例中显示的讲师和Office_Assignments之间建立一对一关系。 请点击这里查看联系方式。
在ruby中,我正在遵循本教程。
我使用以下命令添加了教师模型。
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>从information_schema.key_column_usage中选择table_name,column_name,constraint_name,referenced_table_name,referenced_column_name,其中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
在迁移中,它将添加约束(如果我的内存正确,也可以与变更表块一起使用)
在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.