SQL » Schemas
The SQL adapter adds its own schema types and association declarations to the built-in Relation Schema feature.
Inferring Attributes
If you don't want to declare all attributes explicitly, you can tell rom-sql to infer attributes from an existing schema.
Inference will define normal attributes, foreign keys and primary key (even when it's a composite primary key).
To infer a schema automatically:
require 'rom-sql'
class Users < ROM::Relation[:sql]
schema(infer: true) # that's it
end
Coercions
Relations and commands can coerce output and input data automatically based on your schema attributes.
Default attribute types in schemas are used for input coercions in commands, if you want to apply additional
coercions when relations read their data, you can do it via :read
type in schema definitions:
class Posts < ROM::Relation[:sql]
schema(infer: true) do
attribute :status, Types::String, read: Types.Constructor(Symbol, &:to_sym)
end
end
id = users.insert(title: 'Hello World', status: :draft)
users.by_pk(1).one
# => {:id => 1, :title => "Hello World", status: :draft }
PostgreSQL Types
When you define relation schema attributes using custom PG types, the values will be automatically coerced before executing commands, so you don't have to handle that yourself.
require 'rom-sql'
require 'rom/sql/types/pg'
class Users < ROM::Relation[:sql]
schema do
attribute :meta, Types::PG::JSON
attribute :tags, Types::PG::Array
attribute :info, Types::PG::Hash
end
end
Users.schema[:meta][{ name: 'Jane' }].class
# Sequel::Postgres::JSONHash
Users.schema[:meta][[1, 2, 3]].class
# Sequel::Postgres::JSONArray
Users.schema[:tags][%w(red green blue)].class
# Sequel::Postgres::JSONArray
Users.schema[:info][{ some: 'info' }].class
# Sequel::Postgres::JSONHash