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