Uwaga :Prawdopodobnie chcesz spojrzeć na brcebn odpowiedz, jeśli używasz nowszej wersji Railsów.
Railsy spróbują to zinterpretować:
t.string :uniqueid, default: md5(random()::text)
jako kod Rubiego i :default => md5(...)
nic nie znaczy w Ruby. Jeśli ją zacytujesz, Railsy uznają, że jest to ciąg znaków i stworzą domyślną wartość dla uniqueid
ciąg 'md5(random()::text)'
a to nie pomoże.
Jeśli chcesz użyć wywołania funkcji w domyślnej kolumnie, możesz wykonać alter table
ręcznie:
connection.execute(%q{
alter table your_table alter column uniqueid set default md5(random()::text)
})
Dzięki temu uzyskasz wartość domyślną, którą chcesz w bazie danych, ale możesz zauważyć, że nie ma wzmianki o nowej wartości domyślnej w twoim schema.rb
. Jeśli potrzebujesz użytecznego schematu, musisz użyć schematu SQL, umieszczając go w application.rb
:
config.active_record.schema_format = :sql
Następnie usuń swój schema.rb
i użyj structure.sql
zamiast. Zwróć uwagę, że zrzuty schematów SQL były zepsute do wersji 3.2 i występują problemy z ładowaniem schematów w różnych wersjach Railsów (ale zawsze możesz psql < structure.sql
sposób na obejście tego). Z drugiej strony, zrzuty schematów SQL będą śledzić wymyślne rzeczy, prawdziwe klucze obce, sprawdzać ograniczenia, wyzwalacze, ...
BTW, jeśli naprawdę chcesz SHA, spójrz na digest
funkcja z pgcrypto
.