在ActiveRecord中创建外键约束

at.*_*at. 13 activerecord ruby-on-rails foreign-keys ruby-on-rails-3 ruby-on-rails-3.2

如何在ActiveRecord中创建外键?我的模型中有以下内容:

class Student < ActiveRecord::Base
  attr_accessible :name, :level_id
  belongs_to :level
end

class Level < ActiveRecord::Base
  attr_accessible :number
  has_many :students
end
Run Code Online (Sandbox Code Playgroud)

但schema.rb和开发sqlite3数据库没有任何指示外键约束是使用level_id字段设置的.这是我必须手动除ActiveRecord或Rails之外的事情吗?我错过了一步吗?

使用Rails 3.2.8

mgu*_*mon 13

ActiveRecord不需要外键约束来正确映射关系.您可以使用验证让Rails应用程序确保数据完整性.

Rails迁移不提供帮助程序来创建外键.您可以在迁移中为约束创建自己的SQL,也可以使用Foreigner Gem.Foreigner将提供帮助方法来在迁移中创建约束:

add_foreign_key(:students, :levels)
Run Code Online (Sandbox Code Playgroud)

  • 虽然第一句是真的,但它没有回答这个问题.许多开发人员都同意,拥有良好约束的数据库模式与依赖应用程序来管理完整性一样重要,如果不是更重要,这个答案会阻碍良好的数据库设计原则,IMO也没有用. (5认同)
  • 可悲的是没有。迁移将创建索引,但不会创建外键。来自 http://guides.rubyonrails.org/migrations.html - “引用助手实际上不会为您创建外键约束。您将需要使用执行或添加外键支持的插件。” (2认同)

Seg*_*ult 13

如果你有轨> = 4.2和使用mysql,mysql2postgresql适配器,那么您可以使用add_foreign_key您的迁移这样的方法:

# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
Run Code Online (Sandbox Code Playgroud)

API参考