次は正しいですか?
change_column :tablename, :fieldname, :limit => null
以前に移行で制限を指定していて、制限を単に削除したい場合、これを行うことができます:
change_column :users, :column, :string, :limit => 255
255は文字列列の標準の長さで、Railsは以前に指定した制限を消去します。
更新しました:
これは多くのRails=バージョンで動作しますが、おそらくGiuseppeの答えのようにnil
を使用する方が適しているでしょう。
change_column :users, :column, :string, :limit => nil
つまり、間違っていたのは、null
の代わりにnil
を使用することだけでした。
これが私に起こったことです。
テーブルにある文字列フィールドではコンテンツを保持するには不十分であることに気づいたため、次の内容を含む移行を生成しました。
def self.up
change_column :articles, :author_list, :text
end
ただし、移行の実行後、スキーマには以下が含まれていました。
create_table "articles", :force => true do |t|
t.string "title"
t.text "author_list", :limit => 255
end
どちらも大丈夫ではありませんでした。そこで、次のように移行を「再編集」しました。
def self.up
# careful, it's "nil", not "null"
change_column :articles, :author_list, :text, :limit => nil
end
今回、schema.rbの制限はなくなりました。
create_table "articles", :force => true do |t|
t.string "title"
t.text "author_list"
end
列タイプを:text
に変更します。制限はありません。
change_column :tablename, :fieldname, :text, :limit => nil
制限のない文字列は、ほとんどのデータベースでサポートされているものではありません。varchar(SIZE)
定義でサイズを指定する必要があります。
試してみることはできますが、個人的には:limit => BIG_ENOUGH_NUMBER
。また、非常に大きなテキストにはCLOBタイプの使用を検討することもできます。
Db-driverに依存しないようにするには、smthを次のように記述する必要があります。
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
私は今日も同じ船で、テキストフィールドに追加した制限を取り除こうとしましたが、それはかかりませんでした。いくつかの移行を試みました。
Rails 4.2.7.1 Ruby 2.3.1p112
結局、255の制限を指定するだけで機能しました。他のものに調整しようとしてもうまくいきませんでした。