web-dev-qa-db-ja.com

Rails移行では、フィールドの制限をどのように削除できますか

次は正しいですか?

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

以前に移行で制限を指定していて、制限を単に削除したい場合、これを行うことができます:

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

255は文字列列の標準の長さで、Railsは以前に指定した制限を消去します。

更新しました:

これは多くのRails=バージョンで動作しますが、おそらくGiuseppeの答えのようにnilを使用する方が適しているでしょう。

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

つまり、間違っていたのは、nullの代わりにnilを使用することだけでした。

95
Jeremy Baker

これが私に起こったことです。

テーブルにある文字列フィールドではコンテンツを保持するには不十分であることに気づいたため、次の内容を含む移行を生成しました。

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
34
Giuseppe

列タイプを:textに変更します。制限はありません。

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

制限のない文字列は、ほとんどのデータベースでサポートされているものではありません。varchar(SIZE)定義でサイズを指定する必要があります。
試してみることはできますが、個人的には:limit => BIG_ENOUGH_NUMBER。また、非常に大きなテキストにはCLOBタイプの使用を検討することもできます。

0
Nikita Rybak

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
0
user420577

私は今日も同じ船で、テキストフィールドに追加した制限を取り除こうとしましたが、それはかかりませんでした。いくつかの移行を試みました。

Rails 4.2.7.1 Ruby 2.3.1p112

結局、255の制限を指定するだけで機能しました。他のものに調整しようとしてもうまくいきませんでした。

0
GiantCoder