2012-02-01 17 views
12

tengo una cita en la columna de tabla como:rieles establecer la fecha actual como valor por defecto

create_table "test", :force => true do |t| 
    t.date "day" 
end 

quiero fijar fecha actual como valor por defecto para esta columna. Trato de la siguiente manera:

create_table "test", :force => true do |t| 
    t.date "day", :default => Date.today 
end 

Pero siempre por defecto es el 1 de febrero por lo que si puedo crear nuevo mañana registro, el día de hoy todavía es el 1 mar (esperar es Feb 2º)

Gracias por la respuesta!

Nota: Yo uso sqlite en los carriles 3

Respuesta

22

Carriles no es compatible con los valores predeterminados dinámicos de las migraciones. Lo que haya en su migración durante su ejecución se establecerá en el nivel de base de datos y se mantendrá de esa manera hasta que la migración se retrotraiga, anule o restablezca. Pero puede agregar fácilmente valores predeterminados dinámicos en el nivel del modelo, ya que se evalúa en tiempo de ejecución.

1) Valor predeterminado utilizando after_initialize devolución de llamada

class Test 
    def after_initialize 
    self.day ||= Date.today if new_record? 
    end 
end 

El uso de este enfoque sólo si es necesario para acceder al atributo después de la inicialización y antes de guardar el registro. Este enfoque tiene un costo de procesamiento adicional al cargar un resultado de consulta, ya que el bloque debe ejecutarse para cada objeto de resultado.

2) Valor predeterminado utilizando before_create devolución de llamada

class Test 
    before_create do 
    self.day = Date.today unless self.day 
    end 
end 

Esta devolución de llamada se activa mediante una llamada create en su modelo. There are many more callbacks. Por ejemplo, establecer la fecha anterior a la validación en create y update.

class Test 
    before_validation on: [:create, :update] do 
    self.day = Date.today 
    end 
end 

3) Utilizando el default_value_for joya

class Test 
    default_value_for :day do 
    Date.today 
    end 
end 
+0

Muchas gracias, funciona – banhbaochay

1

No creo que se puede hacer eso en una migración. Sin embargo, Rails ya tiene un campo created_at agregado a las nuevas migraciones del modelo que hace lo que usted desea. Y si necesita que su propio atributo haga lo mismo, simplemente use un before_save o before_validate para establecerlo si es nulo.

3

Sólo completando la respuesta de Harish Shetty.
Para aplicaciones Rails, se debe utilizar la siguiente sintaxis:

class Test < ActiveRecord::Base 
    after_initialize do |test| 
     test.day ||= Date.today if new_record? 
    end 
    end 
Cuestiones relacionadas