ROR doesn’t realize functionality of setting default values for models. We can use db’s default values but they are evaluated during migrations. We can’t set default value i.e. Time.now. But there are completed gems that realize this. I.e. default_value_for (https://github.com/FooBarWidget/default_value_for). Why not to merge it in rails? Thanks.
Isn’t this just the same as having a before_save callback where you define these default values?
Also, what do you mean with “We can use db’s default values but they are evaluated during migrations”?
That is a problem for me either.
I can’t use before_save callback because I need to show the default value on forms.
So, I have a date field and the default value is today, but when user open the form, today must be on that field.
I’m setting this kind of default value on controller like that:
def new
@payment = Payment.new
@payment.date = Date.current
end
But this become a mess since I have “dynamic” default values in almost every model of my application.
This is relevant: http://stackoverflow.com/questions/328525/what-is-the-best-way-to-set-default-values-in-activerecord
They mention using after_initialize.
Allen Madsen http://www.allenmadsen.com
Using a after initialize does not respect if you set the attribute to nil, like this:
Payment.new(:due_date => nil)
Also, it will mutate the already persisted objects if they are persisted using a nil due date for example.
Another problem happens when you select specific attributes like:
Payment.select(:id, :person_id).first
It raises an exception on after initialize hook because there is no
due date attribute
One method I was surprised to not see on Stack Overflow - overriding the accessor:
class Payment < AR::Base
def date super || write_attribute(:date, Date.current) end
end
This still has the issue identified by G. Sobrinho, however, where explicitly setting an attribute to nil doesn't work quite right.
--Matt Jones