2012-02-01 14 views
12

mam randkę kolumny w tabeli jako:Szyny migracji ustawić bieżącą datę jako wartość domyślną

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

Chcę ustawić aktualną datę jako wartość domyślna dla tej kolumny. staram jak poniżej:

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

Ale domyślnym zawsze jest 1 lutego, więc jeśli utworzyć nowy rekord jutro, dzień nadal jest 01 lutego (oczekiwany jest 02 lutego)

Dzięki za odpowiedzi!

Uwaga: Używam SQLite w szynach 3

Odpowiedz

22

Rails nie obsługuje dynamicznych wartości domyślne w migracji. Cokolwiek znajduje się w migracji podczas jej wykonywania, zostanie ustawione na poziomie DB i pozostanie w ten sposób do momentu wycofania, przesłonięcia lub zresetowania migracji. Można jednak łatwo dodać dynamiczne wartości domyślne na poziomie modelu, ponieważ jest on oceniany w środowisku wykonawczym.

1) wartości domyślne ustawienie za pomocą after_initialize zwrotnego

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

użyć tego podejścia tylko jeśli chcesz uzyskać dostęp do atrybutu po inicjalizacji i przed zapisywania rekordu. Takie podejście ma dodatkowy koszt przetwarzania podczas ładowania wyniku zapytania, ponieważ blok musi zostać wykonany dla każdego obiektu wyniku.

2) wartości domyślne ustawienie za pomocą before_create zwrotnego

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

Ta funkcja zwrotna jest wyzwalane przez create rozmowy na modelu. There are many more callbacks. Na przykład ustawienie daty przed sprawdzaniem poprawności na create i update.

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

3) Używanie default_value_for gem

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

Dziękuję bardzo, to działa – banhbaochay

1

Nie sądzę, że można to zrobić w migracji. Ale Rails ma już pole created_at dodane do nowych migracji modelu, które robi to, co chcesz. A jeśli potrzebujesz własnego atrybutu robiącego to samo, po prostu użyj opcji before_save lub before_validate, aby ustawić ją, jeśli jest zerowa.

3

Wystarczy ukończenie odpowiedź Harish Shetty jest.
Dla aplikacji Rails, należy użyć następującej składni:

class Test < ActiveRecord::Base 
    after_initialize do |test| 
     test.day ||= Date.today if new_record? 
    end 
    end 
Powiązane problemy