2013-04-24 19 views
13

stworzyłem nową migrację, gdzie wymienionyRails 3.2 + MySQL: Błąd: Pole „created_at” nie ma wartości domyślnej: INSERT INTO

... 
t.timestamps 

w utworzonej tabeli dodaje te dwie kolumny

... 
| created_at | datetime | NO (Null) |  | NULL (Default) |     
| updated_at | datetime | NO (Null) |  | NULL (Default) | 
... 

Kiedy chcę utworzyć nowy element, zawsze pojawia się komunikat o błędzie

Mysql2::Error: Field 'created_at' doesn't have a default value: INSERT INTO `table_name` (`first_col`, `second_col`) VALUES ('a', 'b') 

Am I czegoś brakuje? Wysłałem ten miniapp do mojego przyjaciela i jest on w stanie uruchomić go z powodzeniem -> rekord jest tworzony w bazie danych.

Czego mi brakuje?

+0

Jak się tworząc nową pozycję? – ericeason

+0

'@photo = Photo.new (params [: photo])' ... '@ photo.save' – user984621

Odpowiedz

16

Po prostu wpadłem na coś podobnego w nowej instalacji MySql na Mac OS.

W końcu zawęziłem to do kombinacji nowszych wersji MySql, domyślnie włączając "tryb ścisły", a mój projekt ma tabelę z pewnymi ograniczeniami. Stawką, o której mowa, była "tabela łączenia" używana w relacji :has_and_belongs_to_many. W jakiś sposób ta tabela została utworzona z atrybutami :created_at i :updated_at, które miały na sobie ograniczenie :null => false. Railsy 3.2 nie wypełniają automatycznie pól znacznika czasu dla tabel łączenia w relacjach :habtm. Kiedy tryb ścisły jest wyłączony MySql zapełni cols wyzerowanymi datami, takimi jak 0000-00-00 00:00:00. Przy włączonym trybie ścisłym podnosi wyjątek.

Aby rozwiązać ten problem, przeprowadziłem migrację, aby pola znacznika czasu były puste. Tak:

class ChangeNullableForTimestampsOnThing1sThing2s < ActiveRecord::Migration 
    def up 
    change_column(:thing1s_thing2s, :created_at, :datetime, :null => true) 
    change_column(:thing1s_thing2s, :updated_at, :datetime, :null => true) 
    end 

    def down 
    change_column(:thing1s_thing2s, :created_at, :datetime, :null => false) 
    change_column(:thing1s_thing2s, :updated_at, :datetime, :null => false) 
    end 
end 

szczerze, to chyba lepiej po prostu upuścić kolumny, jeśli nie są potrzebne, ale mamy kilka szczególnych przypadkach, kiedy rzeczywiście się ustawić ręcznie.

+1

Bardzo pomocne dziękuję. Mam nadzieję, że wkrótce to naprawią. Tutaj jest więcej dyskusji na temat: https://github.com/rails/rails/issues/10307 –

4

dodać do odpowiedzi Jeremy'ego, na mac można usunąć tryb ścisły z

> vi /usr/local/opt/mysql/my.cnf 

następnie zastąpić

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

z

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"