Module: Sequel::Plugins::PgRow

Defined in:
lib/sequel/plugins/pg_row.rb,
lib/sequel/extensions/_model_pg_row.rb

Overview

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'))

Defined Under Namespace

Modules: ClassMethods, DatabaseMethods, InstanceMethods

Class Method Summary collapse

Class Method Details

.configure(model) ⇒ Object

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.



54
55
56
57
# File 'lib/sequel/plugins/pg_row.rb', line 54

def self.configure(model)
  model.db.extension(:pg_row, :_model_pg_row)
  model.register_row_type if model.instance_variable_get(:@dataset)
end