事后如何添加rails关系?

时间:2011-08-18 13:45:15

标签: ruby-on-rails migration

我已经创建了我的模型,并经历了几次迁移。现在,我想在has_many :books中设置Subject,在belongs_to :subject设置Book。我已将这些文件添加到.rb文件中,但我仍然可以保存一本不存在的subject_id的书。我期待FK约束违规。

我必须为此创建迁移文件吗?如果是这样,我该怎么做?

1 个答案:

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