Shopify/tapioca

ActiveRecord Column DSL: Support ActiveRecord::Type::Json and ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Jsonb

marknuzz opened this issue · 3 comments

I was surprised to see that both json and jsonb columns in postgres are mapped as T.untyped despite having popular usage. I couldn't find any discussions about this when searching the issues.

json => ActiveRecord::Type::Json
jsonb => ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Jsonb

Question for maintainers: Are there any known gotchas for implementing this in a straightforward way compared to other types? I have some concerns here because it seems like if it isn't implemented there was a good reason for that, but I couldn't find a mention of that anywhere.

I don't think using ActiveRecord::Type:: in a signature makes sense for setters and getters. Playing around a little bit I think we could do T::Hash[T.untyped, T.untyped] instead for json columns, it seems to be automatically serialized/deserialized. I assume it's similar for Postgres.

Yeah sorry it wasn't clear. ActiveRecord::Type::Json is the type used internally by ActiveRecord and the type that the compiler would be implementing. The signature output would be a form of T::Hash.

JSON/JSONB columns also can contain arrays, strings, and floats as I understand it.