Index: lib/data_mapper/property.rb =================================================================== --- lib/data_mapper/property.rb (revision 720) +++ lib/data_mapper/property.rb (working copy) @@ -143,7 +143,7 @@ PROPERTY_OPTIONS = [ :public, :protected, :private, :accessor, :reader, :writer, :lazy, :default, :nullable, :key, :serial, :column, :size, :length, - :format, :index, :check, :ordinal, :auto_validation + :format, :index, :check, :ordinal, :auto_validation, :references ] VISIBILITY_OPTIONS = [:public, :protected, :private] Index: lib/data_mapper/adapters/sql/mappings/column.rb =================================================================== --- lib/data_mapper/adapters/sql/mappings/column.rb (revision 720) +++ lib/data_mapper/adapters/sql/mappings/column.rb (working copy) @@ -6,7 +6,7 @@ # TODO: There are of course many more options to add here. # Ordinal, Length/Size, Nullability are just a few. class Column - attr_reader :type, :name, :ordinal, :size, :default, :check + attr_reader :type, :name, :ordinal, :size, :default, :check, :references attr_writer :lazy, :index, :unique attr_accessor :table, :options @@ -28,6 +28,7 @@ @unique = if @options[:index] == :unique then @options.delete(:index); true else false end @index = @options[:index] @check = @options[:check] # only for postgresql + @references = @options[:references] #only for postgresql @size = if @options.has_key?(:size) @options[:size] Index: lib/data_mapper/adapters/postgresql_adapter.rb =================================================================== --- lib/data_mapper/adapters/postgresql_adapter.rb (revision 720) +++ lib/data_mapper/adapters/postgresql_adapter.rb (working copy) @@ -58,8 +58,19 @@ TYPES.merge!({ :integer => 'integer'.freeze, - :datetime => 'timestamp with time zone'.freeze + :datetime => 'timestamp with time zone'.freeze, }) + + FOREIGN_KEY_MATCHES = { + :full => "FULL".freeze, + :partial => "PARTIAL".freeze, + :simple => "SIMPLE".freeze + } + + FOREIGN_KEY_ACTIONS = { + :restrict => "RESTRICT".freeze, + :cascade => "CASCADE".freeze, + :set_null => "SET NULL".freeze } module Mappings class Table @@ -154,6 +165,18 @@ "CHECK (" << check << ")" end + def references_declaration + out = "" + + out << "REFERENCES " << references[:reftable] + out << "(" << references[:refcolumn] << ")" if references.has_key?(:refcolumn) + out << " MATCH " << FOREIGN_KEY_MATCHES[references[:match]] if references.has_key?(:match) + out << " ON DELETE " << FOREIGN_KEY_ACTIONS[references[:on_delete]]if references.has_key?(:on_delete) + out << " ON UPDATE " << FOREIGN_KEY_ACTIONS[references[:on_update]] if references.has_key?(:on_update) + + out + end + def to_alter_sql "ALTER TABLE " << table.to_sql << " ALTER COLUMN " << to_alter_form end @@ -234,12 +257,17 @@ if check && !check_declaration.blank? @to_long_form << " #{check_declaration}" end + + if references && !references_declaration.blank? + @to_long_form << " #{references_declaration}" + end end @to_long_form end end + # size is still required, as length in postgres behaves slightly differently def size nil end