= dm-constraints

Plugin that adds foreign key constraints to associations.
Currently supports only PostgreSQL and MySQL

All constraints are added to the underlying database, but constraining is implemented in
pure ruby.


=== Constraints

 - :protect     returns false on destroy if there are child records
 - :destroy     deletes children if present
 - :destroy!    deletes children directly without instantiating the resource, bypassing any hooks
                Does not support 1:1 Relationships as #destroy! is not supported on Resource in dm-master
 - :set_nil     sets parent id to nil in child associations
                Not valid for M:M relationships as duplicate records could be created (see explanation in specs)
 - :skip        Does nothing with children, results in orphaned records

By default a relationship will PROTECT its children.


=== Cardinality Notes
 * 1:1
  * Applicable constraints: [:set_nil, :skip, :protect, :destroy]

 * 1:M
  * Applicable constraints: [:set_nil, :skip, :protect, :destroy, :destroy!]

 * M:M
  * Applicable constraints: [:skip, :protect, :destroy, :destroy!]


=== Examples

  # 1:M Example
  class Post
    has n, :comments
    # equivalent to:
    # has n, :comments, :constraint => :protect
  end

  # M:M Example
  class Article
    has n, :tags, :through => Resource, :constraint => :destroy
  end

  class Tags
    has n, :articles, :through => Resource, :constraint => :destroy
  end

  # Intermediary constraints for relationships using :through => Resource
  # are automatically inherited from the M:M relationship.

  # 1:1 Example
  class User
    has 1, :address, :constraint => :protect
  end
