2013-04-24 12 views
13

ho creato una nuova migrazione, in cui è menzionatoRails 3.2 + MySQL: Errore: Il campo 'created_at' non ha un valore predefinito: INSERT INTO

... 
t.timestamps 

nella tabella creata si aggiungono queste due colonne

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

Quando voglio creare un nuovo elemento, ho sempre arrivare il messaggio di errore

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

mi sto perdendo qualcosa? Ho inviato questo miniapp a un mio amico e lui è in grado di eseguire con successo eseguirlo -> il record viene creato nel database.

Cosa mi manca?

+0

Come stai creando il nuovo articolo? – ericeason

+0

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

risposta

16

Mi sono imbattuto in qualcosa di simile su una nuova installazione di MySql su Mac OS.

Infine, ho ridotto il limite alla combinazione delle versioni più recenti di MySql attivando "strict mode" per impostazione predefinita e il mio progetto ha una tabella con alcuni vincoli discutibili su di esso. La tabella in questione era la "tabella di join" utilizzata in una relazione :has_and_belongs_to_many. In qualche modo tale tabella era stata creata con gli attributi :created_at e :updated_at con un limite di :null => false. Rails 3.2 non popola automaticamente i campi di timestamp per le tabelle di join delle relazioni :habtm. Quando la modalità rigorosa è disattivata, MySql popolerà solo i campi con date azzerate, come 0000-00-00 00:00:00. Con la modalità strict attivata solleva un'eccezione.

Per risolvere il problema, ho eseguito una migrazione per consentire ai campi di timestamp di essere nulli. Come questo:

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 

Onestamente, è probabilmente meglio cadere solo le colonne se non ne hanno bisogno, ma abbiamo un paio di casi particolari in cui in realtà Get Set manualmente.

+1

Molto utile grazie. Spero che risolveranno questo presto. Qui c'è più di una discussione sul problema: https://github.com/rails/rails/issues/10307 –

4

da aggiungere alla risposta di Jeremy, su un Mac è possibile rimuovere la modalità rigorosa con

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

quindi sostituire

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

con

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 
Problemi correlati