Ruby on rails 通过数据库级外键维护数据库完整性

Ruby on rails 通过数据库级外键维护数据库完整性,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,作为rails的新手,我有点惊讶于rails迁移/ActiveRecord没有为有多个,有一个和其他关系创建数据库级外键。从对该主题的搜索中可以清楚地看出,这是rails的方式 我在书中偶然发现了一个例子,它在第110页使用了下面的例子 class Product < ActiveRecord::Base has_many :line_items before_destroy :ensure_not_referenced_by_any_line_item ... priva

作为rails的新手,我有点惊讶于rails迁移/ActiveRecord没有为
有多个
有一个
和其他关系创建数据库级外键。从对该主题的搜索中可以清楚地看出,这是rails的方式

我在书中偶然发现了一个例子,它在第110页使用了下面的例子

class Product < ActiveRecord::Base
  has_many :line_items
  before_destroy :ensure_not_referenced_by_any_line_item
  ...
  private

    # ensure that there are no line items referencing this product
    def ensure_not_referenced_by_any_line_item
      if line_items.empty?
        return true
      else
        errors.add(:base, 'Line Items present')
        return false
      end
    end
end
类产品
这个例子让我感到畏缩,因为
确保任何行项目都不会引用
正是程序员会忘记添加的东西。另外,在我看来,它需要更多的代码行,意味着更多的bug等等

我在同一个话题上发现了这个已经有五年多的历史了。我也意识到了这一点


我的问题是关于rails的现状。是否支持数据库级外键?还有其他选择吗,比如外国人宝石?我对Sqlite3和MySQL后端感兴趣。

还有一个更干净的解决方案

有很多:行项目,:依赖=>:限制#引发ActiveRecord::DeleteRestrictionError

这将引发一个您可以捕获的错误

在任何情况下,都需要指定
dependent
选项,以避免在数据库中留下孤立项。开发人员有责任记住这些事情,并在Rails中设置适当的条件

有很多:行项目,:dependent=>:delete#将删除所有子记录

我从来没有使用任何额外的宝石来处理外键