情景:在一個資料表裡,有 2 個欄位分別是 export_comment
跟 import_comment
,這兩個欄位的屬性是 string
。
問題:這兩位為 string
的欄位,當輸入超過 255 字元數時,網站會報錯,無法讓使用者繼續操作。
解決方法:修正為 text 型態,可儲存 65535 字元數。
步驟一:在我們的 Terminal 輸入 rails g migration change_comment_to_fd_documents
,建立一個 Migration 檔案。
狀況一:這個寫法透過 rubocop 風格檢查,會跳出為 Rails/BulkChangeTable: You can use change_table :fd_documents, bulk: true to combine alter queries.
的錯誤,意思是要我們改用這種寫法。
class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
change_column :fd_documents, :export_comment, :text
change_column :fd_documents, :import_comment, :text
end
狀況二:按照狀況一的錯誤提示,將 Migration 檔案改寫,請參考如下。
class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
change_table :fd_documents, bulk: true do |t|
t.text :export_comment
t.text :import_comment
end
end
但是,在 Terminal 輸入 rails db:migrate
時,會出現 Mysql2::Error: Duplicate column name export_comment: ALTER TABLE fd_documents ADD export_comment text, ADD import_comment text
的錯誤訊息,這個大概的意思是,在我們的資料表裡,已重複 export_comment
跟 import_comment
欄位。
狀況三:按照狀況一跟狀況二的錯誤訊息來看,我再次將 Migration 檔案改寫,請參考如下。
class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
change_table :fd_documents, bulk: true do |t|
change_column :fd_documents, :export_comment, :text
change_column :fd_documents, :import_comment, :text
end
end
但是,透過 rubocop 風格檢查,會跳出以下的錯誤訊息,意思是說我們不需要 t 這個參數時,則可以忽略它。
Lint/UnusedBlockArgument: Unused block argument - t. You can omit the argument if you don't care about it.
change_table :fd_documents, bulk: true do |t|
^
經過以上三種狀況的各個錯誤,我重新查詢了一下資料跟詢問資深的同事,得到了一些問題的點:
最後,將 Migration 檔案重新改寫,就可以正常運作了。
# frozen_string_literal: true
class ChangeCommentToFDDocuments < ActiveRecord::Migration[5.2]
def self.up
change_column :fd_documents, :export_comment, :text
change_column :fd_documents, :import_comment, :text
end
def self.down
change_column :fd_documents, :export_comment, :string
change_column :fd_documents, :import_comment, :string
end
end