foreign_key_validation
Protect your models by specifying a collection of relations that should be tested for consistency with a predefined column (e.g. user_id).This is useful when the column user_id is used in multiple models. We can check if the user_id of model A matches user_id of model B before saving the records - if the IDs are different, an error will be attached to the errors hash of checked model.
Requirements
ruby >= 1.9.3
active_record & active_support >= 3.2.0
Installation
Add this line to your application's Gemfile:
gem 'foreign_key_validation'
And then execute:
$ bundle
Or install it yourself as:
$ gem install foreign_key_validation
Usage
Call validate_foreign_keys below the association definitions (belongs_to, ...) in your model. By default it assumes that it should check all belongs_to relations against the user_id column. So any relation will be checked for a matching user_id.
Change behaviour by calling validate_foreign_keys with arguments hash.
validate_foreign_keys on: :admin_user, with: [:project]
This would only check model.project.admin_user_id to match model.admin_user_id before saving the record.
Configuration
You can customize the default behaviour of the gem by calling the configure method on the module with a block (e.g. initializer).
ForeignKeyValidation.configure do |config|
config.error_message = lambda { |key, name, object| "My custom msg!" }
config.inject_subclasses = false # default: true
config.validate_against = :admin # default: :user
end
Tests
Use these commands to run the testsuite against different versions of ActiveRecord
bundle
appraisal install
appraisal rspec
Contributing
- Fork it ( https://github.com/marcusg/foreign_key_validation/fork )
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request