Post

ActiveModelでは`text`型は指定不可のことについて

今回のFormObjectでうっかりbodyのタイプをtextに指定してしまい、Unknown type :textのエラーが出た。
調べたら、ActiveModelではtextタイプをサポートしてないことがわかった。

サポートしているタイプはドキュメントでの明確な説明は見つからなかったが、ソースコードでのファイル名を見れば何とか推測できる
Rails APIでのファイル名リストを見ると、textが入ってないことがわかった。 ActiveModel::Type

一方、ActiveRecord::Typeではtextファイルがあって、中身を見ると、typeを:textに指定することができることがわかる。

調べているところ、そもそもstringtextは本質上で違いがないことがわかった。
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

This post is licensed under CC BY 4.0 by the author.