Rodrigo Rosenfeld Rosas
Getting started with Sequel in Rails
Why Sequel?
In short, I feel it is better designed than ActiveRecord and makes some non-trivial queries much easier to implement and read. Detailed information can be found here.
How to use Sequel models?
I didn’t create any generator or gem for my application. It is just pretty simple to setup your environment.
- Add “gem ‘sequel’” to your Gemfile
- Create an initializer, like config/initializers/setup-sequel.rb (see example below)
- Create your models (see example below)
1 | # config/initializers/setup-sequel.rb |
2 | c = ActiveRecord::Base.configurations[Rails.env] |
3 | c['adapter'] = 'postgres' if c['adapter'] == 'postgresql' |
4 | c['user'] = c.delete 'username' |
5 | c['logger'] = [Rails.logger, Logger.new("log/#{Rails.env}_db.log")] |
6 | c['logger'] << Logger.new(STDOUT) if Rails.env.development? |
7 | DB = Sequel::Model.db = Sequel.connect c |
8 | Sequel::Model.db.sql_log_level = Rails.application.config.log_level || :info |
9 | |
10 | if ARGV.any?{|p| p =~ /(--sandbox|-s)/} |
11 | # do everything inside a transaction when using rails c --sandbox (or -s) |
12 | DB.pool.after_connect = proc do |conn| |
13 | DB.send(:add_transaction, conn, {}) |
14 | DB.send(:begin_transaction, conn, {}) |
15 | end |
16 | end |
17 | |
18 | # Sequel::Model.plugin :active_model |
19 | # Sequel::Model.plugin :validation_helpers |
You can enable the available plugins directly in the initializer or in a per-class basis.
If you’re using FactoryGirl, it requires the model classes to respond to ‘save!’, so you can add this to your initializer:
1 | module Sequel::Plugins::FactoryGirlSupport |
2 | module InstanceMethods |
3 | def save! |
4 | save_changes raise_on_save_failure: true |
5 | end |
6 | end |
7 | end |
8 | Sequel::Model.plugin Sequel::Plugins::FactoryGirlSupport # or plugin :factory_girl_support |
Finally, create your models:
1 | # app/models/user.rb |
2 | class User < Sequel::Model |
3 | # do whatever you want here |
4 | end |
If you’re used to ActiveRecord you can take a look at Sequel for ActiveRecord Users.
Devise
If you want to use your Sequel model as a Devise authentication class, please take a look at the sequel-devise gem.
In short, just append “gem ‘sequel-devise’” to your Gemfile (you’ll also need the ‘devise’ gem if you’re starting from scratch).
Then, enable your User class to be compatible with Devise. If you want to keep your current User class while you’re giving this a try, just put it in another namespace, as in the example below:
1 | # app/models/sq/user.rb |
2 | module SQ |
3 | class User < Sequel::Model |
4 | plugin :devise |
5 | devise :database_authenticatable |
6 | end |
7 | end |
Finally, in your routes, if you’re using this namespaced User class, you’ll need to adapt your devise_for statement to something like:
1 | # config/routes.rb |
2 | devise_for :users, class_name: 'SQ::User' |
RSpec
For running your examples inside database transactions, you can add this to your spec_helper.rb:
1 | # setup transactional factory for Sequel |
2 | config.around(:each) do |example| |
3 | DB.transaction do |
4 | example.run |
5 | raise Sequel::Error::Rollback |
6 | end |
7 | end |
Have fun
Feel free to leave any questions in the comments or to report any bugs to the sequel-devise gem.
If you’re like me, you’ll enjoy Sequel way better than ActiveRecord.