it-swarm.com.de

Wie können Sie bei einer Rails-Migration die Begrenzung eines Felds entfernen?

Ist das Folgende richtig?

 change_column :tablename, :fieldname, :limit => null
46
kidbrax

Wenn Sie zuvor in einer Migration ein Limit angegeben haben und das Limit einfach entfernen möchten, können Sie Folgendes tun:

change_column :users, :column, :string, :limit => 255

255 ist die Standardlänge für eine Zeichenfolgenspalte, und Rails löscht nur das zuvor festgelegte Limit.

Aktualisierte:

Während dies in einer Reihe von Rails-Versionen funktioniert, sind Sie wahrscheinlich besser geeignet, nil wie in der Antwort von Giuseppe zu verwenden.

change_column :users, :column, :string, :limit => nil

Das heißt, das einzige, was Sie falsch gemacht haben, war null anstelle von nil.

93
Jeremy Baker

Hier ist was mir passiert ist.

Ich erkannte, dass ein Zeichenfolgenfeld, das ich in einer Tabelle hatte, nicht ausreichte, um den Inhalt zu enthalten. Daher generierte ich eine Migration, die Folgendes enthielt:

def self.up
  change_column :articles, :author_list, :text
end

Nach dem Ausführen der Migration hatte das Schema jedoch Folgendes:

create_table "articles", :force => true do |t|
  t.string   "title"
  t.text     "author_list", :limit => 255
end

Was war nicht in Ordnung . Also habe ich die Migration wie folgt "redid":

def self.up
  # careful, it's "nil", not "null"
  change_column :articles, :author_list, :text, :limit => nil
end

Dieses Mal war das Limit in schema.rb weg:

create_table "articles", :force => true do |t|
  t.string   "title"
  t.text     "author_list"
end
34
Giuseppe

Ändern Sie den Spaltentyp in :text. Es gibt keine Grenze.

change_column :tablename, :fieldname, :text, :limit => nil
3
edgerunner

Zeichenfolgen ohne Begrenzung unterstützen die meisten Datenbanken nicht: Sie müssen die Größe in varchar(SIZE) definition angeben.
Obwohl Sie es versuchen könnten, würde ich persönlich mit :limit => BIG_ENOUGH_NUMBER gehen. Sie können auch den CLOB-Typ für sehr große Texte in Betracht ziehen.

0
Nikita Rybak

Um es db-Treiber-unabhängig zu machen, sollte man Folgendes schreiben:

add_column :tablename, :fieldname_tmp, :text
Tablename.reset_column_information
Tablename.update_all("fieldname_tmp = fieldname")
remove_column :tablename, :fieldname
rename_column :tablename, :fieldname_tmp, :fieldname
0
user420577

Ich war heute dasselbe Boot und versuchte, ein Limit zu entfernen, das ich einem Textfeld hinzugefügt hatte, und das würde nicht reichen. Versuchte mehrere Migrationen. 

Schienen 4.2.7.1 Ruby 2.3.1p112

Letztendlich funktionierte nur ein Limit von 255. Der Versuch, mich auf etwas anderes einzustellen, würde für mich nicht funktionieren.

0
GiantCoder