Let’s say we have a
City model and corresponding UI enabling user to manage
the list of cities, eventually we discovered that forgot to add validation of
uniqueness for the city names and some users was able to create duplicate entries.
No panic! Let’s fix it now!
The first step is obvious - uniqueness validation helper:
1 2 3 4
So far so good, but, as documentation says, it does not create a uniqueness constraint in the database, so it may happen that two different database connections create two records with the same value for a column that you intend to be unique.
Let’s move on and create that constraint.
This is unique index we’ll add to the name attribute on the
cities with the
1 2 3 4 5
That’s was easy, right? And usually enough, but, as you remember, at the beginning of the post, I mentioned that some users was able to create duplicate records, so, how would we solve that problem?
We’ll need to enrich our migration with corresponding behavior and there are many solutions we can easily find with google to achieve this.
For this post I’ll use
dedupe method from the following answer on StackOverflow:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
You might be wondering why we’re using faux model here? That’s a common practice for using models in migrations, the rails guide describes it well.
If there are any of associations referencing
cities we’ve to fix those, i.e.
city_id to reference remaining and unique cities.