'Rails: validate uniqueness of two columns (together)
I have a Release
model with medium
and country
columns (among others). There should not be releases
that share identical medium
/country
combinations.
How would I write this as a rails validation?
Solution 1:[1]
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
Solution 2:[2]
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 [:country, :medium, :another_medium], unique: true
Solution 3:[3]
You can pass a :scope
parameter to your validator like this:
validates_uniqueness_of :medium, scope: :country
See the documentation for some more examples.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | David Moles |
Solution 2 | Justin |
Solution 3 |