通过数据库级​​别的外键维护数据库的完整性(Maintaining database integri

2019-10-20 09:51发布

作为新的轨道,我有点惊讶的是,轨道迁移/的ActiveRecord不会创建数据库级的外键has_manyhas_one等关系。 它是从话题搜索清楚,这是轨道的方式。

我在书里偶然发现一个例子敏捷Web开发使用Rails 4 ,它使用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

这个例子让我畏缩,因为ensure_not_referenced_by_any_line_item正是这种事情程序员会忘记补充。 而且,在我看来,它需要更多的代码意味着更多的错误,等等。

我发现这个线程是关于同一主题的超过五岁。 我也觉察到的外国人宝石 。

我的问题是有关事务的轨道的当前状态。 是否支持数据库级别的外键了吗? 有没有像外国人宝石别的选择吗? 我感兴趣的SQLITE3和MySQL后端。

Answer 1:

还有这一个清洁的解决方案

has_many :line_items, :dependent => :restrict # raises ActiveRecord::DeleteRestrictionError

这将提高,你可以捕获错误。

在任何情况下,你需要指定dependent选项,以避免留在你的数据库的孤儿。 这是开发商的责任记住这些东西,并设置在导轨适当的条件。

has_many :line_items, :dependent => :delete # Will remove all child records

我从来没有使用过任何其他宝石来处理外键。



文章来源: Maintaining database integrity through database level Foreign Keys