diff options
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb index 0577f868e1..a19bcc86c2 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb @@ -637,20 +637,31 @@ module ActiveRecord # # add_belongs_to(:products, :supplier, polymorphic: true) # - # ====== Create a supplier_id, supplier_type columns and appropriate index + # ====== Create supplier_id, supplier_type columns and appropriate index # # add_reference(:products, :supplier, polymorphic: true, index: true) # + # ====== Create a supplier_id column and appropriate foreign key + # + # add_reference(:products, :supplier, foreign_key: true) + # def add_reference( table_name, ref_name, polymorphic: false, index: false, + foreign_key: false, type: :integer, **options ) polymorphic_options = polymorphic.is_a?(Hash) ? polymorphic : options index_options = index.is_a?(Hash) ? index : {} + foreign_key_options = foreign_key.is_a?(Hash) ? foreign_key : {} + + if polymorphic && foreign_key + raise ArgumentError, "Cannot add a foreign key to a polymorphic relation" + end + add_column(table_name, "#{ref_name}_id", type, options) if polymorphic @@ -660,6 +671,10 @@ module ActiveRecord if index add_index(table_name, polymorphic ? %w[type id].map{ |t| "#{ref_name}_#{t}" } : "#{ref_name}_id", index_options) end + + if foreign_key + add_foreign_key(table_name, ref_name.to_s.pluralize, foreign_key_options) + end end alias :add_belongs_to :add_reference |