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.
ruby >= 1.9.3
active_record & active_support >= 3.2.0
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
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.
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
Use these commands to run the testsuite against different versions of ActiveRecord
bundle
appraisal install
appraisal rspec
- 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