PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie setze ich in einer Rails-Migration den Standardwert einer Spalte auf NOW() anstelle der Zeit, zu der ich die Migration ausgeführt habe?

Es ist nicht gut dokumentiert, aber Sie können ein Lambda als Standardwert bei einer Migration angeben, und das wird das Richtige tun. Wenn Sie Folgendes sagen:

def change
  change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end

dann wird der Standardwert der Spalte auf now() gesetzt und die Datenbankfunktion now() wird erst aufgerufen, wenn ein Standardwert für die Spalte benötigt wird. Dann, wenn Sie \d stratum_worker_submissions in psql Sie werden sehen:

created_at | timestamp without time zone | not null default now()

wie gewünscht. Jeder andere Standardwert wird ausgewertet, wenn die Migration ausgeführt wird, und Sie erhalten einen festen Zeitstempel als Standardwert.

Alternativ können Sie dies auch immer manuell mit SQL tun:

def up
  connection.execute(%q(
    alter table stratum_worker_submissions
    alter column created_at
    set default now()
  ))
end
def down
  connection.execute(%q(
    alter table stratum_worker_submissions
    alter column created_at
    drop default
  ))
end

Beachten Sie, dass Sie beim manuellen Ändern des Schemas mit SQL möglicherweise Dinge tun, die nicht in db/schema.rb erscheinen da Sie schnell in SQL einsteigen können, das ActiveRecord nicht versteht. In diesem Fall können Sie von db/schema.rb wechseln zu db/structure.sql durch Ändern von config/application.rb :

config.active_record.schema_format = :sql

und dann db/schema.rb ersetzen mit db/structure.sql in der Revisionskontrolle und unter Verwendung der db:structure Rechenaufgaben anstelle des üblichen db:schema Aufgaben.