Foreigner
Adds foreign key helpers to migrations and correctly dumps foreign keys to schema.rb
Install / Use
/learn @matthuhiggins/ForeignerREADME
Foreigner
Foreigner introduces a few methods to your migrations for adding and removing foreign key constraints. It also dumps foreign keys to schema.rb.
The following adapters are supported:
- mysql2
- postgres
- sqlite (foreign key methods are a no-op)
Foreigner was rendered obsolete in Rails 4.2. The migration DSL supports foreign keys out of the box via add_foreign_key and remove_foreign_key.
Installation
Add the following to your Gemfile:
gem 'foreigner'
API Examples
Foreigner adds two methods to migrations.
add_foreign_key(from_table, to_table, options)remove_foreign_key(from_table, to_table, options)
(Options are documented in connection_adapters/abstract/schema_statements.rb):
For example, given the following model:
class Comment < ActiveRecord::Base
belongs_to :post
end
class Post < ActiveRecord::Base
has_many :comments, dependent: :delete_all
end
You should add a foreign key in your migration:
add_foreign_key(:comments, :posts)
The :dependent option can be moved from the has_many definition to the foreign key:
add_foreign_key(:comments, :posts, dependent: :delete)
If the column is named article_id instead of post_id, use the :column option:
add_foreign_key(:comments, :posts, column: 'article_id')
A name can be specified for the foreign key constraint:
add_foreign_key(:comments, :posts, name: 'comment_article_foreign_key')
The :column and :name options create a foreign key with a custom name. In order to remove it you need to specify :name:
remove_foreign_key(:comments, name: 'comment_article_foreign_key')
Change Table Methods
Foreigner adds extra methods to create_table and change_table.
Create a new table with a foreign key:
create_table :products do |t|
t.string :name
t.integer :factory_id
t.foreign_key :factories
end
Add a missing foreign key to comments:
change_table :comments do |t|
t.foreign_key :posts, dependent: :delete
end
Remove an unwanted foreign key:
change_table :comments do |t|
t.remove_foreign_key :users
end
Database-specific options
Database-specific options will never be supported by foreigner. You can add them using :options:
add_foreign_key(:comments, :posts, options: 'ON UPDATE DEFERRED')
Foreigner Add-ons
- immigrant - generate a migration that includes all missing foreign keys.
- sqlserver-foreigner - A plugin for SQL Server.
License
Copyright (c) 2012 Matthew Higgins, released under the MIT license
Related Skills
node-connect
328.7kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
81.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
328.7kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
81.0kCommit, push, and open a PR
