Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 3: Validate combined values

In Rails 2.x you can use validations to make sure you have a unique combined value like this:

validates_uniqueness_of :husband, :scope => :wife 

In the corresponding migration it could look like this:

add_index :family, [:husband, :wife], :unique => true 

This would make sure the husband/wife combination is unique in the database. Now, in Rails 3 the validation syntax changed and the scope attribute seems to be gone. It now looks like:

validates :husband, :presence => true 

Any idea how I can achieve the combined validation in Rails 3? The Rails 2.x validations still work in Rails 3 so I can still use the first example but it looks so "old", are there better ways?

like image 603
Cimm Avatar asked Mar 28 '10 15:03

Cimm


1 Answers

Bear with me. The way the validates method in ActiveModel works is to look for a Validator.

:presence => true looks for PresenceValidator and passes the options: true to the validator's initializer.

I think you want

validates :husband, :presence => true, :uniqueness => {:scope => :wife} 

(The uniqueness validator is actually part of ActiveRecord, not ActiveModel. It's really interesting how the developers set this up. It's quite elegant.)

like image 89
epochwolf Avatar answered Sep 22 '22 12:09

epochwolf