ActiveModelでは`text`型は指定不可のことについて
今回のFormObjectでうっかりbody
のタイプをtext
に指定してしまい、Unknown type :text
のエラーが出た。
調べたら、ActiveModelではtext
タイプをサポートしてないことがわかった。
サポートしているタイプはドキュメントでの明確な説明は見つからなかったが、ソースコードでのファイル名を見れば何とか推測できる
Rails APIでのファイル名リストを見ると、textが入ってないことがわかった。 ActiveModel::Type
一方、ActiveRecord::Type
ではtextファイルがあって、中身を見ると、typeを:text
に指定することができることがわかる。
調べているところ、そもそもstring
とtext
は本質上で違いがないことがわかった。
ActiveRecordでのtextはActiveModelのStringから継承している。
(class Text < ActiveModel::Type::String
ActiveRecordでtext型を指定しても、取扱方はstringとはほぼ一緒。(違いはformでtext_areaタグを生成するぐらい?)
そのため、ActiveModelでtext型を使いたい場合、単にstringにすれば良い。
MySQLやPostgresSQLなどのDBでも、text型とvarchar型は本質上の違いがないらしい。
例えば、PostgresSQLでは、varchar(n), char(n)とtextが格納できる最大文字長(1GB)は同じで、違いはtextは文字数上限指定がない、残りの二つは上限指定ができること。
MySQLでは、似たような状況で、VARCHARとTEXTどちらも上限は65,535文字で、ただindex設定したい時や上限指定したい時は、VARCHARが良い。
それより、元々SQL標準仕様では文字列のデータ型はCHARとVARCHARのみで、text型がない。
参照
Mimic SQL table with ActiveModel Attributes
PostgreSQL: Difference between text and varchar (character varying)
Difference between VARCHAR and TEXT in MySQL
PostgreSQL Character Types
MySQL 11.3 String Data Types