Rails: Validate unique combination of 3 columns

Solution 1:

There is a syntax error in your code snippet. The correct validation is :

validates_uniqueness_of :car_model_name, :scope => [:brand_id, :fuel_type_id]

or even shorter in ruby 1.9.x:

validates_uniqueness_of :car_model_name, scope: [:brand_id, :fuel_type_id]

with rails 4 you can use:

validates :car_model_name, uniqueness: { scope: [:brand_id, :fuel_type_id] }

with rails 5 you can use

validates_uniqueness_of :car_model_name, scope: %i[brand_id fuel_type_id]

Solution 2:

Depends on your needs you could also to add a constraint (as a part of table creation migration or as a separate one) instead of model validation:

add_index :the_table_name, [:brand, :model_name, :fuel_type], :unique => true

Adding the unique constraint on the database level makes sense, in case multiple database connections are performing write operations at the same time.

Solution 3:

To Rails 4 the correct code with new hash pattern

validates :column_name, uniqueness: {scope: [:brand_id, :fuel_type_id]}