4

ich eine Migration habe, die wie die jetztGrenze einer Textspalte in einer Active Migration 5.0 mit dem PostgreSQL-Adapter

class CreateQuestionings < ActiveRecord::Migration[5.0] 
    def change 
    create_table :questionings do |t| 
     t.text :body, null: false, limit: 260 
    end 
    end 
end 

aussieht, wenn ich $ rake db:migrate:reset die Grenze ausgeführt wird nirgendwo in meinem db/schema.rb zu sehen:

create_table "questionings", force: :cascade do |t| 
    t.text  "body",  null: false 
end 

Mache ich es falsch oder ist das ein Fehler?

Übrigens verwende ich Schienen 5.0.0.beta3 und Ruby 2.3.0p0.

Antwort

5

t.text erzeugt eine text Spalte in PostgreSQL und text doesn't allow for size limits weil text ist:

variable unbegrenzter Länge

Da es keine Grenze von der Datenbank unterstützt ist, die PostgreSQL-Treiber wird nicht für einen Blick :limit Option; Denken Sie daran, dass Sie sagen, t.text(column_name, options_hash), so dass Sie werfen können, was Sie wollen in options_hash und der Treiber ignoriert alles, was es nicht speziell sucht.

Wenn Sie die Spaltengröße begrenzen, dann können Sie entweder manuell eine CHECK-Einschränkung hinzufügen (die Active werden nicht verstehen, so dass Sie von schema.rb zu structure.sql wechseln müssen) oder verwenden Sie eine varchar Spalte (AKA t.string):

t.string :body, null: false, limit: 260 

auch Ihre schema.rb erzeugt wird, basierend auf, was in der Datenbank enthalten ist, nicht das, was in Ihrem Migrationen. Da text kein Limit unterstützt, weiß die Datenbank nichts über Ihre limit: 260 Option. Wenn die Datenbank nichts davon weiß, wird ActiveRecord sie nicht von der Datenbank zurückholen, wenn ActiveRecord die Datenbank nach Schemainformationen fragt.

+0

Das beantwortet meine Frage. Auch Ihr Vorschlag, 't.string' zu verwenden, funktioniert perfekt für mich. Danke vielmals! – esBeee

Verwandte Themen