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?
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?
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?
the |email| in proc will return object of record (not the attribute), so you hav eto use :if => proc {|r| !r.email.blank?}
tom
You can use
validates_uniqueness_of :email, :if => proc {|email| !email.blank? }
Search for conditional validations for more info.
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?
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.