Shopify / tapioca

The swiss army knife of RBI generation
MIT License
743 stars 125 forks source link

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

Open marknuzz opened 2 months ago

marknuzz commented 2 months ago

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.

KaanOzkan commented 1 month ago

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.

marknuzz commented 1 month ago

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.

alex-tan commented 1 month ago

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