我在轨道4.2上的红宝石。现在使用关系并尝试在ContosoUniversity of .net MVC示例中显示的讲师和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&gt;描述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&GT;从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,但不明白
答案 0 :(得分:1)
运行
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'等等。
答案 1 :(得分:1)
Rails默认情况下不会创建外键约束(只有自4.2以来你才能在不使用原始sql或额外的gem的情况下执行此操作)
如果你把
add_foreign_key :office_assignments, :instructors
在迁移中,它会添加约束(如果我的内存正确,还可以使用变更表块的变体)
在rails 4.2.1(尚未发布)中,您将能够
t.belongs_to :instructor, foreign_key: true
一次性完成所有操作
答案 2 :(得分:0)
我改变了我的迁移,如下所示,也在模型中包含我的主键
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