# Custom validation

**URL:** <https://www.ruby-forum.com/t/custom-validation/144278>\
**Category:** Rails\
**Created:** [July 28, 2008, 5:47am UTC](https://www.ruby-forum.com/t/custom-validation/144278 "2008-07-28T05:47:14Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![skirkpatrick](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/73ab20/32.png) [@skirkpatrick](https://www.ruby-forum.com/u/skirkpatrick)\
**Post date:** [July 28, 2008, 5:47am UTC](https://www.ruby-forum.com/t/custom-validation/144278/1 "2008-07-28T05:47:14Z")

</div>

i’m trying to use a custom validation but for some reason it’s seems  
like it is just getting ignored.

in my model:  
before\_save :validate

def validate  
total\_rank = 0

```
for compound_material in self.compound_materials
  total_rank += self.item.rank
end

avg_rank = total_rank / self.compound_materials.length

max_rank = avg_rank + 4

if self.item.rank > max_rank
   errors.add_to_base "The compound entered is not valid because it

```

is greater than rank " + self.item.rank  
end  
end

anyone know what i should be doing differently?

---

<div class="post-metadata">

**Author:** ![skirkpatrick](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/73ab20/32.png) [@skirkpatrick](https://www.ruby-forum.com/u/skirkpatrick)\
**Post date:** [July 28, 2008, 4:08pm UTC](https://www.ruby-forum.com/t/custom-validation/144278/2 "2008-07-28T16:08:34Z")

</div>

On Sun, Jul 27, 2008 at 10:47 PM, Scott K.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> for compound\_material in self.compound\_materials  
> end  
> end
> 
> anyone know what i should be doing differently?

I believe that you need to return false from the filter in order to  
halt the save process.

A better solution would be to use validates\_each

[http://api.rubyonrails.com/classes/ActiveRecord/Validations/ClassMethods.html#M001045](http://api.rubyonrails.com/classes/ActiveRecord/Validations/ClassMethods.html#M001045)

---

<div class="post-metadata">

**Author:** ![skirkpatrick](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/73ab20/32.png) [@skirkpatrick](https://www.ruby-forum.com/u/skirkpatrick)\
**Post date:** [July 29, 2008, 1:25am UTC](https://www.ruby-forum.com/t/custom-validation/144278/3 "2008-07-29T01:25:05Z")

</div>

> I believe that you need to return false from the filter in order to  
> halt the save process.
> 
> A better solution would be to use validates\_each
> 
> [Peak Obsession](http://api.rubyonrails.com/classes/ActiveRecord/Validations/ClassMethods.html#M001045)

thanks. returning false did the trick. I’m not sure if validate each  
will work in this case because I am not actually validating a field for  
this object. I was validating compound.item.rank.
