Module: Sequel::Plugins::PgRow

Defined in:
lib/sequel/plugins/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

Note that automatic conversion only works with the native postgres adapter. For other adapters that connect to PostgreSQL, you need to call the conversion proc manually.

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.



56
57
58
59
60
# File 'lib/sequel/plugins/pg_row.rb', line 56

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