我应该使用ON DELETE CASCADE,:dependent =>:destroy,还是两者都使用?

Eth*_*han 3 ruby mysql activerecord ruby-on-rails

在Rails应用程序中,我在MySQL中有外键约束,我将它们全部手动设置,与我的迁移分开.

我想弄清楚我是否应该使用ActiveRecord的:dependent => :destroy选项.例如,在我的架构中,我有表...

users
-----

log_entries
-----------
user_id  # Has FK constraint to users.id with ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)

在我的模型中我可以......

class User < ActiveRecord::Base
  has_many :log_entries, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)

我应该在模型上省略相关选项并将其留给数据库吗?或者那里有那个好吗?删除此应用程序中的内容时,我不需要运行任何回调.在所有情况下,只需删除它们即可.

另一个要考虑的因素是我的测试环境中不会出现FK约束,可能是因为rake db:test:prepare没有设置它们.因此,如果我完全依赖MySQL来级联删除,那么很难测试会发生什么.

Mic*_*aer 7

如果您的FK具有ON DELETE CASCADE,则不应在模型中使用dependent =>:destroy.它可以运行不必要的查询,你不能指望它不会在将来破坏它.您应该在模型文件中添加注释以记录它正在发生的事情.虽然.

我还建议在迁移中执行FK.如果您的测试数据库与生产数据库具有相同的约束,那会更好,这可能会导致非常狡猾的错误.有一个RedHill插件(redhillonrails_core)使迁移中的外键变得容易,并且启用了具有FK约束的模式转储,因此测试更加简单.