I have a Release
model with medium
and country
columns (among others). There should not be releases
that share identical
All the above answers are missing how to validate the uniqueness of multiple attributes in a model. The code below intends to tell how to use multiple attributes in a scope.
validates :country, uniqueness: { scope: [:medium, :another_medium] }
It validates uniqueness of country
in all rows with values of medium
and another_medium
.
Note: Don't forget to add an index on the above column, this insures fast retrieval and adds a DB level validation for unique records.
Update: For adding an index while creating table
t.index [:medium, :another_medium], unique: true
You can pass a :scope
parameter to your validator like this:
validates_uniqueness_of :medium, scope: :country
See the documentation for some more examples.
You can use a uniqueness validation with the scope
option.
Also, you should add a unique index to the DB to prevent new records from passing the validations when checked at the same time before being written:
class AddUniqueIndexToReleases < ActiveRecord::Migration
def change
add_index :releases, [:country, :medium], unique: true
end
end
class Release < ActiveRecord::Base
validates :country, uniqueness: { scope: :medium }
end