belongs_to和引用实际上在表中创建关系?

时间:2015-03-13 08:06:58

标签: mysql ruby-on-rails ruby-on-rails-4 foreign-key-relationship

我在轨道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,但不明白

3 个答案:

答案 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