我已经创建了我的模型,并经历了几次迁移。现在,我想在has_many :books
中设置Subject
,在belongs_to :subject
设置Book
。我已将这些文件添加到.rb文件中,但我仍然可以保存一本不存在的subject_id的书。我期待FK约束违规。
我必须为此创建迁移文件吗?如果是这样,我该怎么做?
答案 0 :(得分:4)
您可以分别使用script/generate migration
生成一个单独的迁移文件(没有模型),或者rails g migration
生成rails 2/3。然后,您可以将约束包含在迁移文件中的self.up方法中,并使用rake db:migrate在数据库上运行它们。
但请注意,除非您计划使用自己的自定义代码处理错误以捕获ActiveRecord错误,否则最好使用rails验证来确保存在关联。即。
应用程序/模型/ book.rb
validates_presence_of :subject
编辑:如果要将外键添加到数据库中,则必须使用与数据库引擎相关的命令集知道如何执行此操作(例如,对于MySQL http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html )。由于rails设计用于不支持外键的数据库,因此rails migration Toolkit中没有内置函数可以帮助您完成此过程。
概述了迁移中需要的内容(使用MySQL特定语法):
def self.up
execute "ALTER TABLE books FOREIGN KEY `my_foreign_key_name` (subject_id) REFERENCES subjects (id)"
end
def self.down
execute "ALTER TABLE books DROP FOREIGN KEY `my_foreign_key_name`"
end