The pg_row plugin allows you to use Sequel::Model
classes as composite type classes, via the pg_row extension. So if you have an address table:
DB.create_table(:address) do String :street String :city String :zip end
and a company table with an address:
DB.create_table(:company) do String :name address :address end
You can create a Sequel::Model
for the address table, and load the plugin, which registers the row type:
class Address < Sequel::Model(:address) plugin :pg_row end
Then when you select from the company table (even using a plain dataset), it will return address values as instances of Address:
DB[:company].first # => {:name=>'MS', :address=> # Address.load(:street=>'123 Foo St', :city=>'Bar Town', :zip=>'12345')}
If you want a lot of your models to be used as row types, you can load the plugin into Sequel::Model
itself:
Sequel::Model.plugin :pg_row
And then call register_row_type in the class
Address.register_row_type
In addition to returning row-valued/composite types as instances of Sequel::Model
, this also lets you use model instances in datasets when inserting, updating, and filtering:
DB[:company].insert(name: 'MS', address: Address.load(street: '123 Foo St', city: 'Bar Town', zip: '12345'))
Classes and Modules
Public Class methods
When loading the extension, make sure the database has the pg_row extension loaded, load the custom database extensions, and automatically register the row type if the model has a dataset.
# File lib/sequel/plugins/pg_row.rb 54 def self.configure(model) 55 model.db.extension(:pg_row, :_model_pg_row) 56 model.register_row_type if model.instance_variable_get(:@dataset) 57 end