How to does validates_uniqueness with option :unless work ?

Hi,

I am quite confuse with validates_uniqueness with option :unless.
Correct me if I'm wrong, the :unless => :method option enables
validation to happen to all except that particular method. But when I
used the unless option, it seems to have stop the validating of
uniqueness for all other methods, like :save or :update. Is there a way
to not validate uniqueness in only one action?

Thanks.

Example:
.....In a model.........
validates_uniqueness_of :name, :unless => :deep_clone

   def deep_clone

     result = self.clone

     self.children.each { |c| result.children << c.deep_clone}

     result

   end

Hi,

I am quite confuse with validates_uniqueness with option :unless.
Correct me if I'm wrong, the :unless => :method option enables
validation to happen to all except that particular method. But when I
used the unless option, it seems to have stop the validating of
uniqueness for all other methods, like :save or :update. Is there a way
to not validate uniqueness in only one action?

unless means the validation does not run if the specified method
returns true. Your deep_clone method always returns true so the
validation never runs. It has nothing to do with who caused the
validation to be called or which controller action is being processed.

Fred

Frederick Cheung wrote:

unless means the validation does not run if the specified method
returns true. Your deep_clone method always returns true so the
validation never runs. It has nothing to do with who caused the
validation to be called or which controller action is being processed.

Fred

Hi,

So is it right to say that if the specified method returns true, the
validation does not run at all?

What should I do if I want the validation to run only when I create or
update a record and not when I copy a record? Can I still use the unless
option? If yes how?

Thanks

Frederick Cheung wrote:

unless means the validation does not run if the specified method
returns true. Your deep_clone method always returns true so the
validation never runs. It has nothing to do with who caused the
validation to be called or which controller action is being processed.

Fred

Hi,

So is it right to say that if the specified method returns true, the
validation does not run at all?

yes

What should I do if I want the validation to run only when I create or
update a record and not when I copy a record? Can I still use the unless
option? If yes how?

There's the :on option which distinguishes between updates and creates, but that won't help you here (since copy isn't something AR knows about).

Have a method that returns true when that is the case (that method can be as simple as an attr_accessor which you set to true when relevant)

Fred

Frederick Cheung wrote: