Design question

I have a model with a non obligatory field that must be unique. The code
looks like this:

class Person < ActiveRecord::Base

validates :email,
:uniqueness => { :case_sensitive => false },
:length => { :maximum => 128 },
:email_format => true,
:allow_nil => true

end

When the form is submitted, if the email text field is empty, and empty
string is set as email to the Person object. The problem comes when
trying
to create next person with no email since its storing “” instead of nil.
In order to solve this I want to store nil for the empty string (for
this
field only).

Should I do the check and set on the controller or in the model? I would
go
for the model, but I’m open to suggestions.
In case its done in the model, should be done by overriding the
attribute
setter or using a call back triggered by .save like before_save?

Thanks for the help

You can use
validates_uniqueness_of :email, :if => proc {|email| !email.blank? }

Search for conditional validations for more info.

2011/7/22 Piter F. [email protected]


In case its done in the model, should be done by overriding the attribute
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.


Fernando A.

this is wrong

as in

validates_uniqueness_of :email, :if => proc {|email| !email.blank? }

the |email| in proc will return object of record (not the attribute), so
you hav eto use :if => proc {|r| !r.email.blank?}

tom

On Jul 22, 2011, at 17:39 , Fernando A. wrote:

class Person < ActiveRecord::Base
In order to solve this I want to store nil for the empty string (for this field
only).
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.

Tomas Meinlschmidt, MS {MCT, MCP+I, MCSE, AER}, NetApp Filer/NetCache

www.meinlschmidt.com www.maxwellrender.cz www.lightgems.cz

Excuse me, i dont remembered the exact syntax.

I looked my code now, i use that way

:if => proc {|r| !r[‘email’].blank?}

Thanks Tom.

2011/7/22 Tom M. [email protected]

I have a model with a non obligatory field that must be unique. The code
end
setter or using a call back triggered by .save like before_save?
http://groups.google.com/group/rubyonrails-talk?hl=en.
To post to this group, send email to [email protected].
www.meinlschmidt.com www.maxwellrender.cz www.lightgems.cz
http://groups.google.com/group/rubyonrails-talk?hl=en.


Fernando A.

On Jul 22, 2011, at 1:38 PM, Piter F. wrote:

email| !email.blank? }, work or it will just avoid the application
level validation but still crash with and error trying to insert a
duplicate value on the database?

In case it doesn’t work, what would you recommend?

You could have a:

before_validation :nilify_blank_email

def nilify_blank_email
self.email = nil if self.email.blank?
end

-Rob

:if => proc {|r| !r[‘email’].blank?}

validates_uniqueness_of :email, :if => proc {|email| !email.blank? }

validates :email,
instead of nil.

To unsubscribe from this group, send email to
[email protected]
=
=
To post to this group, send email to rubyonrails-
Fernando A.
.
.
Rob B.
[email protected] http://AgileConsultingLLC.com/
[email protected] http://GaslightSoftware.com/

First than all I want to thanks you for the help, really appreciate it.

I have a question regarding the solution proposed. I also have a unique
key
in the database in order to avoid race conditions.
That is the reason for which I was thinking on setting nil when an blank
String is set, probably should said this before (apologize for that).

Would this solution, validates_uniqueness_of :email, :if => proc
{|email|
!email.blank? }, work or it will just avoid the application level
validation
but still crash with and error trying to insert a duplicate value on the
database?

In case it doesn’t work, what would you recommend?

Thanks again.

On Fri, Jul 22, 2011 at 12:54 PM, Fernando A. <

I’m looking into adding feature toggles to my app

Background reading:

And Jez and David’s book on Continuous Deployment

Basic principle is that you have feature toggles instead of feature
branches for long running features (stuff you can’t deploy to production
same day you start). In addition to being able to hide features while
avoiding the potentially ugly merges you can get with multiple long
running feature branches it also allows you to do cool stuff like
automatically rolling out features to only a subset of users, a/b split
testing of features, etc.

Wondering (a) what best practices are from an implementation perspective
(if any) in Rails and (b) if there are any nice gems to wrap the whole
process of being able to declaratively describe rules about what
features what classes of users would see in what environments, etc.

Any thoughts/ideas/suggestions appreciated.

Best Wishes,
Peter